【问题标题】:Do you need to load contents of Entity Framework collection before you .Add() to it?您是否需要在 .Add() 之前加载实体框架集合的内容?
【发布时间】:2013-01-14 19:34:24
【问题描述】:

我有一个实体模型

class Package
{
...

    virtual ICollection<Owner> Owners { get; set; }
}

并且正在实施AddOwner() 操作。

实体框架是否要求我使用.Include(p =&gt; p.Owners) 检索我的包对象包括所有者,以便我调用p.Add(newOwner);并将更改保存回数据库?

次要问题:直觉并没有引导我在这里找到答案,因为我不知道我的直觉是基于 CLR 集合还是基于实体框架的某些原则;是否有 EF 的原则可以帮助我更好地理解事物而不是思考 CLR 集合?

【问题讨论】:

    标签: entity-framework collections orm


    【解决方案1】:

    只要您的Package 对象附加到上下文,Owners 属性就会设置为EntityCollection&lt;Owner&gt;。无论是否加载,通过该属性所做的更改都将被标记为您的上下文中的更改,SaveChanges() 将保存这些更改。

    请记住,您的 Owner 对象已经需要成为上下文的一部分,如果它是现有所有者的话。如果不是,EF 将假定您正在尝试保存一个新的Owner

    【讨论】:

    • 所以底线是没有必要调用 .Include(p => p.Owners ) 对吗?
    • @TimLovell-Smith 只要您没有其他依赖于 Owners 加载的代码,对,这不是必需的。 EF 方面的唯一变化是在调用 SaveChanges() 之前不会检测到密钥违规(重复的 Owners)。
    【解决方案2】:

    业主迟早必须指出具体的东西,当然在你尝试添加任何东西之前。 EF 知道通过 ICollection 接口查看此属性。

    你可以这样做:

    var p = new Package { SomePackageProperty = "Some value",
    Owners = new List<Owner>>() { new Owner { SomeOwnerProperty = "Some other value" } } };
    
    yourContext.DbSet<Package>().Add(p);
    

    但这只是一个最好的猜测,考虑到问题中提供的小 sn-p。

    【讨论】:

      【解决方案3】:

      我认为您正在考虑包括 Owners .Include(p => p.Owners),然后说 p.Owners.Add(new_owner) 添加新的 Owner,这将在 .SaveChanges 之后起作用。

      【讨论】:

        猜你喜欢
        • 2014-07-21
        • 2011-02-26
        • 1970-01-01
        • 2011-10-20
        • 2013-07-11
        • 1970-01-01
        • 2015-02-15
        • 2014-08-23
        • 1970-01-01
        相关资源
        最近更新 更多