【问题标题】:Entity framework DBcontext add child row实体框架 DBcontext 添加子行
【发布时间】:2013-05-03 07:37:55
【问题描述】:

据我了解,要添加子行,您可以这样做

parent.Children.Add(child);

child.Parents= 父母

然后你可以做 myContext.SaveChanges();

不知何故,第二种解决方案根本不做插入工作。这是我的代码:

        CountMaster countMaster = (from b in pMDataContext.CountMasters
                                   where b.ReportDate == reportDate && b.Department == dept
                                   select b).SingleOrDefault();



        CountDetail countDetail = new CountDetail { CategoryId = 1, StatusId = 1 };

        //countMaster.CountDetails.Add(countDetail);

        countDetail.CountMaster = countMaster;

        pMDataContext.SaveChanges();

【问题讨论】:

    标签: entity-framework frameworks entity-framework-4.1 entity


    【解决方案1】:

    将实体添加到集合导航属性或将其设置为已跟踪实体的引用导航属性时,EF 会将该实体添加到处于EntityState.Added 状态的上下文中。这是由于ObjectStateManager 检测到对被跟踪实体所做的更改。

    如果您以相反的方式工作,即从一个未跟踪的实体开始并将跟踪的实体设置/添加到引用/集合属性,那么ObjectStateManager 无法检测您对该未跟踪的实体所做的更改。因此,您需要在SaveChanges() 之前将实体显式添加到上下文中。

    countDetail.CountMaster = countMaster;
    context.CountDetails.Add(countDetail);
    pMDataContext.SaveChanges();
    

    【讨论】:

    • 嗨,@bmused,您的解决方案确实有效。但在 Julie Lerman 的书中,她指出,如果将 countDetail 的 parent 属性设置为被跟踪的父项,则不必将未跟踪的实体附加到被跟踪的实体。 countDetail.CountMaster = countMaster;自从她的书出版以来,有什么变化吗?
    • @Shredding,没看过这本书。这只是我对使用 EF4/EF5 的理解。只有ObjectStateManager 跟踪的实体才能进行更改检测。如果实体未被跟踪,则ObjectStateManager 无法知道您所做的任何更改。在您的第一个实例中,ObjectStateManager 会收到新实体被添加到跟踪实体的警报,并通过将该新实体添加到ObjectStateManager 来响应。在第二种情况下,ObjectStateManager 无法知道更改,因为没有跟踪实体。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多