![](/img/trans.png)
[英]Violation of PRIMARY KEY constraint in Entity Framework code first link table
[英]Violation of primary key Entity Framework Code First
我已經開始使用C#了,我想創建自己的數據庫。
我有兩個型號
public class AModel
{
public Guid ID { get; private set; }
public string Name { get; set; }
public int Count { get; set; }
public AModel()
{
this.ID = Guid.NewGuid();
}
}
public class BModel
{
public Guid ID { get; private set; }
public string Name { get; set; }
public AModel Model { get; set; }
public BModel()
{
this.ID = Guid.NewGuid();
}
}
當我嘗試將BModel保存到DB時,我收到此錯誤:
違反PRIMARY KEY約束'PK_dbo.AModels'。 無法在對象'dbo.AModels'中插入重復鍵。 重復鍵值為(48ee1711-8da4-46c1-a714-19e985211fed)。\\ r \\ n語句已終止。
我以為它會被解決
modelBuilder.Entity<BModel>().HasRequired(t => t.Model).WithMany();
但看起來我完全迷失了。 這個簡單的例子可以幫助我嗎?
您的評論揭示了重要信息。 當您將組合框中的AModel添加到BModel時,它將在那時與您的DbContext分離。 然后,當您將其添加到模型中時,Entity Framework會認為您有一個新對象。
由於您已將Ids配置為DatabaseGenerationOptions.None,因此它將使用您自己提供的主鍵。 在您的情況下,這是分離對象的PK。 因此,當EF嘗試插入此條目時,它將拋出上述異常,因為具有該鍵的實體已經在那里。
有幾種方法可以解決這個問題:
此實體將在檢索時附加到您的上下文,允許您使用它。 這意味着額外的查找:首先將它們放入組合框中,然后使用組合框中實體的Id從數據庫中再次檢索它。
用法示例:
AModel Get(AModel detachedModel)
{
using(var context = new MyContext())
{
return context.AModels.Single(x => x.ID == detachedModel.ID);
}
}
這應該只是讓實體框架意識到該實體已經存在於數據庫中。
using(var context = new MyContext())
{
context.AModels.Attach(detachedModel);
}
其他附加方法是將狀態設置為Unchanged
context.Entry(detachedModel).State = EntityState.Unchanged;
或修改(如果您也更改了值)
context.Entry(detachedModel).State = EntityState.Modified;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.