【问题标题】:Adding entity in the domain service insert method在域服务插入方法中添加实体
【发布时间】:2011-09-22 21:06:46
【问题描述】:

我有两个实体Parent 和Child,在客户端我创建Parent 然后调用context.submitChanges

在服务器端InsertParent(Parent parent) 我做:

InsertParent(Parent parent)
{
   Child child = this.ObjectContext.Childs.CreateObject();
   parent.child = child;

   if ((parent.EntityState != EntityState.Detached))
   {
     this.ObjectContext.ObjectStateManager.ChangeObjectState(parent, EntityState.Added);
   }
   else
   {
    this.ObjectContext.Parents.AddObject(parent);
   }
}

现在我有两个问题。

在 if else 之前,Parent.id 为 0,在它之后仍然为 0,但在数据库中填充了它。

另一个是,Child 被保存但Child.ParentId 为 0。

我不明白为什么。

实现这种行为的正确方法是什么?我应该直接在上下文中调用SaveChanges() 吗?

【问题讨论】:

    标签: entity-framework wcf-ria-services domainservices


    【解决方案1】:

    检查以确保 edmx 中 Parent.Id 上的 StoreGeneratedPattern 属性设置为 Identity。这应该确保它使用插入的新值进行更新。

    我还将它包装在一个事务中,这样您就可以在设置父 ID 后添加您的孩子。

    using(var scope = new TransactionScope()){
        ObjectContext.Parents.AddObject(parent);
        ObjectContext.SaveChanges(); //parent.id assigned
        parent.child = ObjectContext.Child.CreateObject();
        ObjectContext.SaveChanges();
        scope.Complete(); // commit transaction
    }
    

    【讨论】:

    • EntityFramework 允许您同时添加两者,您甚至不需要为此使用事务。但是您答案的身份部分是正确的,我忘记了。
    • 我可能对当前版本的 EF 有误,但我相信如果您使用的是 POCO 实体并且它们未配置为更改跟踪,那么您确实需要使用事务进行包装。但是,您是正确的,如果您只使用默认的、EF 生成的实体,那么您不应该需要该事务并且一个 SaveChanges 应该可以工作。
    【解决方案2】:

    是的,您应该使用 SaveChanges(),因为这就是将数据保存到数据库中的原因。

    Very Easy Example

    您还需要检查parents.Id列和childs Id列是否设置为身份和主键,以及两个表之间的关系。

    【讨论】:

    • 您能详细说明一下吗?如果我在添加父对象之前调用 SaveChanges(),child.ParentID 将为 0?
    • 如果在添加父对象之前调用 SaveChanges,它不会做任何事情。
    • 这个非常简单的示例向您展示了如何将对象及其子对象添加到数据库中。
    猜你喜欢
    • 1970-01-01
    • 2015-12-30
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多