【问题标题】:how to remove inner collection from a collection using LINQ or Entity framework?如何使用 LINQ 或实体框架从集合中删除内部集合?
【发布时间】:2014-08-01 05:46:40
【问题描述】:

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

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

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

我在使用实体框架时没有使用“LazyLoadingEnabled=false”,因为我希望在从数据库中获取时加载内部集合。

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

请给我一个好的方法。目前我只是在考虑使用 LINQ 删除内部集合。

【问题讨论】:

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


    【解决方案1】:

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

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

    myObject.innerObjects.ToList().ForEach(x =&gt; x.myContext.Entry(x).State = EntityState.Detached);

    这会遍历内部集合并告诉 Entity Framework 停止跟踪每个子项。子项也会从集合中删除。

    在您的情况下,当您使用延迟加载时,即使在子项已分离之后,对内部子集合的任何访问都将触发集合的延迟加载。

    注意,如果没有未来SaveChanges 在数据级别删除关系的风险,则无法使用 LINQ 从集合中删除子实体。

    例如:

    myObject.innerObjects = null;

    myObject.innerObjects = new List&lt;InnerEntity&gt;();

    如果后跟SavesChanges(),则会在数据级别从父实体中删除子实体。

    如果我正确理解了这个问题并且这是您想要实现的目标,我还建议您不要使用延迟加载。 IE。如果您试图明确地塑造您的对象图,您将始终与延迟加载代理竞争。

    【讨论】:

    • 有什么方法我不必使用 context.Entry() 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    相关资源
    最近更新 更多