我从C#开始,我想制作自己的DB。
我有两种型号的
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-19e985211喂养)。\\r\n声明已经终止。
我以为这个会解决这个问题
modelBuilder.Entity<BModel>().HasRequired(t => t.Model).WithMany();
但看起来我完全迷路了。有人能帮我举个简单的例子吗?
您的评论揭示了重要信息。当您将AModel从组合框添加到BModel时,它将从DbContext分离。当您将它添加到模型中时,实体框架会认为您有了一个新对象。
由于您已将ID配置为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);
}
其他连接方式是将状态设置为"未更改">
context.Entry(detachedModel).State = EntityState.Unchanged;
或修改(如果您也更改了值)
context.Entry(detachedModel).State = EntityState.Modified;