c# - 如何使用 EF 核心中已存在的子实体保存实体?

标签 c# entity-framework

我遇到了一个我以前从未见过的非常奇怪的问题。我正在使用 .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

最佳答案

你有三个选择来做到这一点

  1. 使用外键属性

    using ( var db = new MyDbContext(options) )
    {
        var person = new Person
        {
            Name = "Paul",
            DogId = 1
        };
    
        db.Persons.Add(person);
        await db.SaveChangesAsync();
    }
    
  2. 从上下文中加载狗实例并使用该实例

    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();
    }
    
  3. 创建一个带有显式 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/

相关文章:

c# - 将 pdf 转换为来自 url 的流

c# - 无法设置类型的属性,因为集合已设置为 EntityCollection

entity-framework - 删除记录 Entity Framework

c# - 如何从表记录中选择除某些列外的记录

c# - Entity Framework 和 Automapper 中的数据投影

c# - C# 中从 native C++ 继承并将继承类向后传递给 C++

c# - 关于 C# 中 LINQ2Sql 性能的问题

c# - Azure ARM 部署在部署新资源时访问来自不同订阅的资源

c# - 有什么充分的理由不依赖业务逻辑中的数据库 key 完整性吗?

c# - 关于引用/集合/值类型的另一个 C# 问题