我遇到了一个我以前从未见过的非常奇怪的问题。我正在使用 .net CORE 3.0 + EF。 我有两个数据库模型,它们是
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public Dog Dog { get; set; }
}
和
public class Dog
{
public int Id { get; set; }
public string Name { get; set; }
}
那么,假设我的数据库中已经有一条狗记录,其 id=1 且名称 =“Bimbo”。现在,我想添加一个有现有狗的人:
var p = new Person
{
Name = "Peter",
Dog = new Dog
{
Id = 1
};
};
_dbContext.Persons.Add(p);
然后我得到
Cannot insert explicit value for identity column in table 'Dogs' when IDENTITY_INSERT is set to OFF
我知道 EF 试图插入一条狗作为新记录,而我需要它将我的新 Person 记录与现有的 Dog 记录绑定(bind)。
我发现这个解决方案建议明确设置外键。还有另一种方法吗?还是处理这种情况的正确方法? EF Core insert explicit value for identity column
最佳答案
你有三个选择来做到这一点
使用外键属性
using ( var db = new MyDbContext(options) ) { var person = new Person { Name = "Paul", DogId = 1 }; db.Persons.Add(person); await db.SaveChangesAsync(); }
从上下文中加载狗实例并使用该实例
using ( var db = new MyDbContext(options) ) { var dog = db.Dogs.Find(1); var person = new Person { Name = "Paul", Dog = dog }; db.Persons.Add(person); await db.SaveChangesAsync(); }
创建一个带有显式 ID 的狗实例并将其附加到上下文
using ( var db = new MyDbContext(options) ) { var dog = new Dog { Id = 1 }; db.Attach(dog); var person = new Person { Name = "Paul", Dog = dog }; db.Persons.Add(person); await db.SaveChangesAsync(); }
参见 .net fiddle 上的工作示例
关于c# - 如何使用 EF 核心中已存在的子实体保存实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58901164/