3

私はエンティティAB

Aフィールドがあります: id(PK)およびb_fk(FK to B's id)。 B同様のフィールドがあります: id(PK)とa_fk(FK to A's id)。

A今、私はオブジェクトを作成したいと思いますB

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.

1回の保存でこれを機能させる方法はありますか?変更を保存してはならないコードで両方のオブジェクトを作成する必要があるため、context.SaveChanges()以前はどこでも実行できません。

context.SaveChanges()次のようなことが起こる可能性があります。

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

更新:とは両方ともa_fknullb_fk許容です。私はMSSQLとAzureSQLを使用しています。

Update2:次のように変更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

これらの行を削除してみてください。

b.a_fk = a;

context.Bs.AddObject(b);

bオブジェクトをコンテキストに2回追加すると思います。aEFは、外部キーを使用してオブジェクトを追加するときにこれを自動的に実行します。

アップデート:

次の2つのバリエーションを試してください。

  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 に答える
1

モデルに問題があると思います。テーブルには、Bテーブルへの外部キー参照があります。Bテーブルには、Aテーブルへの外部キー参照があります。では、これらのテーブルをマージして、単一のテーブルのみを作成してみませんか?

1対1の関係を作成しようとしている場合、これは適切な方法ではありません。

更新:DB設計が適切ではありません。表Bに外部キーを作成するだけで十分です。表Aに外部キーを作成する必要はありません。そのような設計は、「Aには0個または多数のBがある可能性がある」を満たしているためです。

于 2013-01-23T11:54:49.270 に答える
0

1つのコンテキストを使用し、同時に2つのテーブルを使用したいようなものです。

    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 に答える