3

我必须实体AB.

A有字段: id(PK)和b_fk(FK到B's id)。 B具有相似的字段: id(PK) 和a_fk(FK to A's id)。

现在我想创建对象AB

createAAndBMethod(Entities context){
    A a = new A();
    B b = new B();
    a.b_fk = b;
    b.a_fk = a;
    context.As.AddObject(a);
    context.Bs.AddObject(b);
}

someImportantMethod(){
    //do sth
    Entities context = new Entities(...);
    //do sth, maybe some changes to db on context
    createAAndBMethod(context);
    //do sth, maybe some changes to db on context
    context.SaveChanges();// <-- here I'm getting error
}

保存不起作用并出现错误:Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values.

有什么办法可以通过一次保存来解决这个问题吗?我需要在一些不应该保存更改的代码中创建这两个对象,所以我context.SaveChanges()之前无法在任何地方执行。

Oncontext.SaveChanges()可能会发生类似的事情:

 Create newA with nulled field b_fk
 Create newB with a_fk = newA
 Set newA.b_fk to newB

更新:两者a_fk都可b_fk以为空。我正在使用 MS SQL 和 Azure SQL。

更新2:我改为createAAndBMethod(Entities context)

createAAndBMethod(Entities context){
    A a = new A();
    context.As.AddObject(a);
    B b = new B();
    a.b_fk = b;
}

但它仍然无法使用相同的错误。

4

3 回答 3

1

我认为您的模型有问题;A表有B表的外键引用;并且 B 表具有对 A 表的外键引用。那你为什么不合并这些表,只创建一个表呢?

如果您试图建立一对一的关系,这不是正确的方法。

更新:数据库设计不正确。只在表 B 中创建一个外键就足够了。无需在表 A 中创建外键,因为这样的设计满足“A 可能有 0 个或多个 B”。

于 2013-01-23T11:54:49.270 回答
1

尝试删除这些行:

b.a_fk = a;

context.Bs.AddObject(b);

我认为您将对象添加b到上下文中两次。a当您使用外键添加对象时,EF 会自动执行此操作。

更新:

试试这两种变体:

  createAAndBMethod1(Entities context)
  {
        A a = new A();
        B b = new B();
        a.b_fk = b;
        b.a_fk = a;
        context.As.AddObject(a);
  } 

createAAndBMethod2(Entities context)
{
        A a = new A();
        B b = new B();
        a.b_fk = b;
        context.As.AddObject(a);
        context.SaveChanges();
        b.a_fk = a;
        context.SaveChanges();    
}
于 2013-01-23T11:51:21.297 回答
0

就像你想使用一个上下文,同时你有一个两个表。

    var p = new Person()
    {
        LastName = "test1111111111",
    };
    var c = new Child()
    {
        Name = "Testchild"
    };
    PersonTest(p, c);

    public void PersonTest(Person ob, Child ob2)
    {
        try
        {
            using (var con = new Entities())
            {
                con.Configuration.AutoDetectChangesEnabled = false;
                var o = new Person();
                if (ob.PersonId > 0)
                    o = con.People.Find(ob.PersonId);

                o.PersonId = ob.PersonId;
                o.LastName = ob.LastName;
                if (ob.PersonId == 0)
                    con.People.Add(o);
                con.ChangeTracker.DetectChanges();
                con.SaveChanges();
                i = o.PersonId;

                var o2 = new Child();
                if (ob2.ChildrenId > 0)
                    o2 = con.Children.Find(ob.PersonId);

                o2.PersonId = ob2.ChildrenId;
                o2.Name = ob2.Name;
                o2.PersonId = i;
                if (ob2.ChildrenId == 0)
                    con.Children.Add(o2);
                con.SaveChanges();
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.InnerException.Message);
        }
        finally
        {
            con.Configuration.AutoDetectChangesEnabled = true;
        }
    }
于 2013-01-23T12:53:46.087 回答