簡體   English   中英

違反主要密鑰實體框架代碼

[英]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.

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