簡體   English   中英

在多對多數據庫Sql Server中的過渡表中添加項目和更新關系

[英]Add item and update relationship in transitional table in many-to-many database Sql Server

-這是錯誤的模型,沒有AB之間的許多關聯。 更正於EDIT2--

數據庫中存在A ,數據庫中存在B 我只需要輸入帶有一些Properties1和Properties2的新C元素(並更新現有AB元素中C集合)

我嘗試了很多選項,例如這樣,但是還是有些錯誤(使用ObjectOCntext和存在的Key等)

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更新了模型

在此處輸入圖片說明

context.Entry(dbA).State = EntityState.Unchanged;
context.Entry(dbB).State = EntityState.Unchanged;
context.AddObject(newC);
context.SaveChanges();

顯然,您的newC已經使用正確的Id填充了導航屬性AB 然后,您可以將導航屬性引用的實體附加到上下文:

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();
    }
}

您是否需要映射聯結表? 如果您想要的只是A-> B中的“多對多”,則可以用一種更簡單的方式來實現。

如果您將C表創建為真正的聯結-並且在SQL中將A和B的FK設置為​​它的PK,如下所示:

在此處輸入圖片說明

然后,當您從模型創建edmx時,將創建以下內容:

在此處輸入圖片說明

現在,在代碼中,如果您想添加關系,只需將其添加到集合中,EF就會在您的C表中自動為您創建關系:

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

        A.B.Add(b);
        A.B.Add(b2);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM