0

-- ここでは、AB 間に manyTOmany が関連付けられていない間違ったモデルがありました。修正はEDIT2にあります--

Aデータベースに存在します、データベースにB存在します。CProperties1 と Properties2 を使用して新しい要素を入力するだけで済みます (既存の要素と要素のコレクションを更新Cします) 。AB

たとえば、このような多くのオプションを試しましたが、まだ何かが間違っています (ObjectOCntext と既存のキーなど)

void SaveNewC(C newC)
{
    using (var context = new MyEntities(connectionString))
    {
        var dbA = context.A.Where(a => a.Id == newC.A.Id).SingleOrDefault();
        var dbB = context.B.Where(b => b.Id == newC.B.Id).SingleOrDefault();

        newC.A = dbA;
        newC.B = dbB;
        context.AddObject(newC);

        context.SaveChanges();
    }
}

編集

私が得る例外:"An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key."

EDIT2 更新モデル

ここに画像の説明を入力

4

3 に答える 3

0

どうやら、newCナビゲーション プロパティAB正しいIds が既に設定されているようです。次に、ナビゲーション プロパティによって参照されるエンティティをコンテキストにアタッチするだけです。

void SaveNewC(C newC)
{
    using (var context = new MyEntities(connectionString))
    {
        context.A.Attach(newC.A);
        context.B.Attach(newC.B);

        context.C.AddObject(newC);

        context.SaveChanges();
    }
}
于 2012-09-10T15:41:52.427 に答える
0

ジャンクション テーブルをマップする必要がありますか? A->B からの多対多が必要な場合は、より簡単な方法でそれを行うことができます。

C テーブルを真のジャンクションとして作成し、A への FK と B を次のように SQL の PK に設定した場合:

ここに画像の説明を入力

次に、モデルから edmx を作成すると、次のように作成されます。

ここに画像の説明を入力

コードでリレーションシップを追加する場合は、それをコレクションに追加するだけで、EF によって C テーブルにリレーションシップが自動的に作成されます。

        var A = new A();
        var b = new B();
        var b2 = new B();

        A.B.Add(b);
        A.B.Add(b2);
于 2012-09-11T13:28:54.940 に答える
0
context.Entry(dbA).State = EntityState.Unchanged;
context.Entry(dbB).State = EntityState.Unchanged;
context.AddObject(newC);
context.SaveChanges();
于 2012-09-10T14:45:13.477 に答える