0
class A
{
    int Id; //Primary key
    string Name;
}

class B
{
    int Id; //Primary key
    string Name;
}

class AB
{
    int Id; //PK
    int AId; //FK
    int BId; //FK
}

この状況では、「A」はデータベース「B」に存在し、「AB」は新しく作成されたオブジェクトです。

A a = new A("asd");
B b = new B("qwe");
AB ab = new AB(1, 1);

これをEntityFrameworkでデータベースに追加するにはどうすればよいですか?

こんな感じですか?エンティティごとに3つのコンテキストにする必要がありますか?

mydb.A.Context.ApplyCurrentValues(a)
mydb.B.Context.AddObject(b)
mydb.AB.Context.AddObject(ab) //connected with A and B above
4

2 に答える 2

2

データベースファーストのアプローチでは、まずエンティティ AB が不必要に主キーを関連付けエンティティのみとして持っています。そのテーブルに他の属性を保持する必要がない限り、Pk は必要なく、EF 4 が別のエンティティを作成することになります。

Db 関係図:

ここに画像の説明を入力

EF edmx の結果:

ここに画像の説明を入力

その関係を使用して質問に答えます。

    public void addNewBtoA(B newEntity, A existingEntity) {

        _myContext.Attach(existingEntity);
        existingEntity.B.Add(newEntity);
        myContext.SaveChanges();

    }

編集:

AB レコードは、多対多の関係のために EF によって Db に自動的に作成されます。

編集2:

エンティティ AB に他のプロパティがある場合、EF はそれを別のエンティティとしてインポートし、コンテキストを更新すると、次のように合計されます。

B b = new B {
    Name = "name"
};

AB ab = new AB {

    A = existingA,
    B = b,
    arbitraryProp = "my heart is a fist of blood" 

}

_myContext.Attach(existingA);
_myContext.Add(b);
_myContext.Add(ab);
_myContext.SaveChanges();

EF は .edmx で定義されたモデルの関係に基づいて挿入の順序を決定するため、追加の順序は無関係です。が現在 によって追跡されていないexistingA場合にのみ、アタッチが必要であることに注意してください。つまり、を使用してフェッチされた場合、すでにアタッチされています。existingA_myContextexistingA_myContext.A.SingleOrDefault()

編集3:

public void testab() {
            A existingA = new A {
                Name = "test a"
            };

            using (ABEntities context = new ABEntities()) {
                context.A.AddObject(existingA);

                context.SaveChanges();
            }


            using (ABEntities context = new ABEntities()) {
                B newB = new B {
                    Name = "test b"
                };

                context.Attach(existingA);
                existingA.B.Add(newB);
                context.SaveChanges();
            }
        }
于 2012-09-07T11:02:43.730 に答える
0

AB次のようにクラス定義を変更する必要があります

class AB
{
    public int Id { get; set; }
    public virtual A A { get; set; }
    public virtual B B { get; set; }
}

それで

AB ab = new AB { A = a, B = b };

// if 'a' is not attached call mydb.A.Attach(a);
mydb.AB.AddObject(ab);

EF は、エンティティの挿入順序を把握します。

于 2012-09-07T11:01:35.280 に答える