Перезагрузка свойств навигации в EF 6C#

Место общения программистов C#
Ответить
Anonymous
 Перезагрузка свойств навигации в EF 6

Сообщение Anonymous »

Я прочитал много вопросов о stackoverflow относительно перезагрузки свойства навигации с помощью

Код: Выделить всё

Context.Entry(entity).Collection(p => p.Property).Load()
но в моем случае он не дает обновленных значений из базы данных.

Код: Выделить всё

LazyLoadingДля параметров 
и ProxyCreation установлены значения по умолчанию, которые, как я прочитал, включены по умолчанию.
У меня есть объект теста сущности, который я получил из базы данных с использованием быстрой загрузки со всеми связанными свойствами, используя метод ниже:

Код: Выделить всё

var test = Repository.GetById(testId, null, true, new Expression[] {
bt => bt.Baselining,
ct => ct.Baselining.BaselineTestCase,
dt => dt.Baselining.BaselineTestCase.Baseline,
ft => ft.Baselining.Transaction,
gt => gt.Baselining.Transaction>Select(x=>x.Fields)
});

public virtual T GetById(int id, Func where = null, bool trackChanges = false, params Expression[] includeProps)
{
T item = null;
IQueryable dbQuery = Context.Set();

if (includeProps != null)
foreach(Expression navProp in includeProps)
dbQuery = dbQuery.Include(navProp);

if (where == null)
{
if (!trackChanges)
item = dbQuery.AsNoTracking().FirstOrDefault(t => t.Id == id);
else
item = dbQuery.FirstOrDefault(t => t.Id == id);
}
else
{
if (!trackChanges)
item = dbQuery.AsNoTracking().Where(where).FirstOrDefault(t => t.Id == id);
else
item = dbQuery.Where(where).FirstOrDefault(t => t.Id == id);
}

return item;
}
Я пытаюсь перезагрузить Baselining.Transaction.Fields, используя

Код: Выделить всё

Repository.Reload(test);
Repository.Reload(test.Baselining.BaselineTestCase);
Repository.Reload(test.Baselining.BaselineTestCase.Baseline);
Repository.ReloadNavigationProperties(test.Baselining, x => x.Transaction);

foreach(var tq in test.Baselining.Transaction)
Repository.ReloadNavigationProperties(tq, x => x.Fields);
Методы репозитория выглядят примерно так:

Код: Выделить всё

public virtual void ReloadNavigationProperties(TEntity,TElement>(TEntity entity, Expression navProp) where TEntity : class where TElement : class
{
Context.Entry(entity).Collection(navProp).Load();
}

public virtual T Reload(T entity) where T : class {
Context.Entry(entity).Reload();
return entity;
}
Я отладил приведенное выше выполнение ReloadNavigationProperties с помощью SQL Server Profiler, и он обращается к базе данных и также генерирует SQL-запрос с объединениями, но мой объект не обновляется даже после перезагрузка.
После того, как мне не удалось перезагрузить свойства навигации с помощью описанного выше метода, я пришел к этому тривиальному подходу, который работает...

Код: Выделить всё

foreach (var tq in test.Baselining.Transaction)
foreach (var tqfs in tq.Fields)
Repository.Reload(tqfs);
Потому что у меня есть около 100 TransactionQueryFields для каждого TransactionQuery, и этот вложенный foreach 100 раз перезагружает каждое поле, и это очень-очень медленно и должно быть медленно. ..
Вот сущности

Код: Выделить всё

public class Test
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int id { get; set; }

public virtual Baselining Baselining { get; set; }
public virtual ICollection TestCaseResults { get; set; } = new List();
}

public class Baselining
{
public Baselining() {}

[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int id { get; set; }
public DateTime BaseliningDate { get; set; }

public virtual BaselineTestCase BaselineTestCase { get; set; }
public virtual ICollection Transaction { get; set; } = new List();
}

public class BaselineTestCase
{
public BaselineTestCase() {}

[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int id { get; set; }

public virtual Baseline Baseline { get; set; }
public virtual ICollection Baselinings { get; set; } = new List();
public Baselining LastBaselining {
get { return Baselinings.OrderBy(x => x.BaseliningDate).LastOrDefault(); }
}
}

public class TransactionQuery : TransactionItem
{
public TransactionQuery() {}

[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public override int id { get; set; }

public virtual Baselining Baselining { get; set; }
public virtual ICollection Transaction { get; set; } = new List();
}

public class TransactionQueryField : TransactionItem
{
public TransactionQueryField() {}

[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public override int id { get; set; }
public bool Compare { get; set; }
public bool Critical { get; set; }
}

public abstract class TransactionItem : BaseEntity
{
public string TestResultCode { get; set; }
}

public abstract class BaseEntity
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public virtual T Id { get; set; }
}
Я хочу понять, почему быстрая загрузка со свойствами навигации не загружает обновленные данные. Потому что, насколько я понимаю, если я хочу что-то загрузить, оно должно совершить обратный путь к базе данных и получить обновленные данные. Но даже быстрая загрузка с перезагрузкой не дает мне обновленных значений.
Извините, если я не объяснил это должным образом, хотя я буду признателен за любую помощь относительно того, как загрузить мой поля быстрее могут быть с одной единственной БД туда и обратно.

Подробнее здесь: https://stackoverflow.com/questions/543 ... es-in-ef-6
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»