繁体   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