如何使用LINQ或Entity框架从集合中删除内部集合?

时间:2014-08-01 05:46:41

标签: linq entity-framework entity-framework-5 entity-framework-6 linq-to-objects

我有一个IEnumberable<myObject> myCollectionmyObject的结构如下:

myObject里面有2个集合。它有2个属性,如:

 public virtual ICollection<innerObject> innerObjects{ get; set; }
 public virtual ICollection<innerObject1> innerObjects1 { get; set; }

我没有使用&#39; LazyLoadingEnabled=false&#39;使用实体框架,因为我想从数据库中提取时加载内部集合。

在这种情况下。我有内部集合,但我想在将集合返回给调用方法之前清空内部集合。

请建议我一个好方法。目前我只想使用LINQ删除内部集合。

1 个答案:

答案 0 :(得分:0)

为了澄清,使用LazyLoadingEnabled时,首次访问时将加载内部集合 - 而不是从数据库中获取包含对象时。如果要在包含对象的同时显式获取内部集合,则需要使用内部集合的expliciteager加载。

如果您希望实体框架卸载内部集合 - 即停止跟踪它并将其与包含对象断开连接,您可以执行以下操作:

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()

将从数据级别的父级中删除子实体。

如果我已正确理解了这个问题,而这正是您想要实现的目标,我还建议您远离延迟加载。即如果您试图明确地塑造对象图,那么您将始终与延迟加载代理竞争。