11

我从 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 时,出现此错误:

违反主键约束“PK_dbo.AModels”。无法在对象“dbo.AModels”中插入重复键。重复键值为 (48ee1711-8da4-46c1-a714-19e985211fed)。\r\n语句已终止。

我以为这会解决

modelBuilder.Entity<BModel>().HasRequired(t => t.Model).WithMany();

但看起来我完全迷路了。有人可以帮我这个简单的例子吗?

4

1 回答 1

16

您的评论揭示了重要信息。当您将该 AModel 从您的组合框添加到您的 BModel 时,到那时它将与您的 DbContext 分离。然后,当您将其添加到模型中时,Entity Framework 会认为您有一个新对象。

由于您将 Id 配置为 DatabaseGenerationOptions.None,因此它将使用您自己提供的主键。在您的情况下,这是分离对象的 PK。因此,当 EF 尝试插入此条目时,它将引发上述异常,因为具有该键的实体已经存在。

有几种方法可以解决这个问题:

  • 检索现有实体

该实体将在检索时附加到您的上下文中,允许您使用它。然而,这意味着额外的查找:首先将它们放入组合框中,然后使用组合框中实体的 Id 从数据库中再次检索它。

示例用法:

AModel Get(AModel detachedModel)
{
    using(var context = new MyContext())
    {
        return context.AModels.Single(x => x.ID == detachedModel.ID);
    }
}
  • 附加现有模型

这应该只是让 Entity-Framework 知道该实体已经存在于数据库中。

using(var context = new MyContext())
{
    context.AModels.Attach(detachedModel);
}

其他附加方法是将状态设置为未更改

context.Entry(detachedModel).State = EntityState.Unchanged;

或已修改(如果您还更改了值)

context.Entry(detachedModel).State = EntityState.Modified;
于 2015-04-18T19:39:37.163 回答