我有一个IEnumberable<myObject> myCollection
。 myObject
的结构如下:
myObject
里面有2个集合。它有2个属性,如:
public virtual ICollection<innerObject> innerObjects{ get; set; }
public virtual ICollection<innerObject1> innerObjects1 { get; set; }
我没有使用&#39; LazyLoadingEnabled=false
&#39;使用实体框架,因为我想从数据库中提取时加载内部集合。
在这种情况下。我有内部集合,但我想在将集合返回给调用方法之前清空内部集合。
请建议我一个好方法。目前我只想使用LINQ删除内部集合。
答案 0 :(得分:0)
为了澄清,使用LazyLoadingEnabled
时,首次访问时将加载内部集合 - 而不是从数据库中获取包含对象时。如果要在包含对象的同时显式获取内部集合,则需要使用内部集合的explicit
或eager
加载。
如果您希望实体框架卸载内部集合 - 即停止跟踪它并将其与包含对象断开连接,您可以执行以下操作:
myObject.innerObjects.ToList().ForEach(x => x.myContext.Entry(x).State = EntityState.Detached);
迭代内部集合并告诉Entity Framework停止跟踪每个子项。子项也会从集合中删除。
在您的情况下,当您使用延迟加载时,即使子项已分离,内部子集合的任何访问都将触发集合的延迟加载。
注意,无法使用LINQ从集合中删除子实体,而不会有将来SaveChanges
删除数据级别关系的风险。
E.g:
myObject.innerObjects = null;
或
myObject.innerObjects = new List<InnerEntity>()
;
SavesChanges()
,将从数据级别的父级中删除子实体。
如果我已正确理解了这个问题,而这正是您想要实现的目标,我还建议您远离延迟加载。即如果您试图明确地塑造对象图,那么您将始终与延迟加载代理竞争。