Tom*_*ner 7 c# entity-framework ef-fluent-api
我已经开始使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试将BModel保存到DB时,我收到此错误:
违反PRIMARY KEY约束'PK_dbo.AModels'.无法在对象'dbo.AModels'中插入重复键.重复键值为(48ee1711-8da4-46c1-a714-19e985211fed).\ r \n语句已终止.
我以为它会被解决
modelBuilder.Entity<BModel>().HasRequired(t => t.Model).WithMany();
Run Code Online (Sandbox Code Playgroud)
但看起来我完全迷失了.这个简单的例子可以帮助我吗?
Jer*_*vel 11
您的评论揭示了重要信息.当您将组合框中的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);
}
}
Run Code Online (Sandbox Code Playgroud)
这应该只是让实体框架意识到该实体已经存在于数据库中.
using(var context = new MyContext())
{
context.AModels.Attach(detachedModel);
}
Run Code Online (Sandbox Code Playgroud)
其他附加方法是将状态设置为Unchanged
context.Entry(detachedModel).State = EntityState.Unchanged;
Run Code Online (Sandbox Code Playgroud)
或修改(如果您也更改了值)
context.Entry(detachedModel).State = EntityState.Modified;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13127 次 |
| 最近记录: |