Код: Выделить всё
Context.Entry(entity).Collection(p => p.Property).Load()
Код: Выделить всё
LazyLoadingДля параметров У меня есть объект теста сущности, который я получил из базы данных с использованием быстрой загрузки со всеми связанными свойствами, используя метод ниже:
Код: Выделить всё
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;
}
Код: Выделить всё
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;
}
После того, как мне не удалось перезагрузить свойства навигации с помощью описанного выше метода, я пришел к этому тривиальному подходу, который работает...
Код: Выделить всё
foreach (var tq in test.Baselining.Transaction)
foreach (var tqfs in tq.Fields)
Repository.Reload(tqfs);
Вот сущности
Код: Выделить всё
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
Мобильная версия