无法使用EF Core在ASP.NET Core中创建相关实体

时间:2019-04-05 07:45:58

标签: entity-framework azure asp.net-core entity-framework-core ef-core-2.0

我在Entity Framework Core 2.0中创建相关实体时遇到问题。我刚刚创建了解决方案,其中包括一个Asp.Net Core后端项目和一个充当客户端的UWP项目。两种解决方案共享模型。这两个模型是:

public class UnitOfWork {
    public int UnitOfWorkId { get; set; }
    public string Name { get; set; }
    public Human Human { get; set; }
}

public class Human {
    public int HumanId { get; set; }
    public string Name { get; set; }
    public List<UnitOfWork> WorkDone { get; set; }
}

如您所见,模型非常简单。一个human有很多units of work。顺便说一下,后端已连接到Azure SQL数据库。我已经看到了迁移类,并且数据库架构对我来说很好。

我遇到的问题是当我想使用HTTP创建引用现有unit of work的{​​{1}}时。控制器非常简单:

human

再次,这里没有什么幻想。

如何创建工作单元并将其分配给现有人员?如果我在现有的人身上尝试过这种方式

[HttpPost]
public UnitOfWork Post([FromBody] UnitOfWork unitOfWork) {
    using (var db = new DatabaseContext()) {
        db.UnitsOfWork.Add(unitOfWork);
        var count = db.SaveChanges();
        Console.WriteLine("{0} records saved to database", count);
    }
    return unitOfWork;
}

我收到此错误:

  

当IDENTITY_INSERT设置为OFF时,无法为表“人类”中的身份列插入显式值

我认为将IDENTITY_INSERT设置为ON可以解决我的问题,但这不是我想要的。在客户端中,我将选择一个现有的var humans = await Api.GetHumans(); var firstHuman = humans.First(); var unitOfWorkToCreate = new UnitOfWork() { Name = TbInput.Text, Human = firstHuman, }; ,记下human的名称,然后创建后者。这是正确的进行方式吗?

编辑:在@Ivan Stoev回答之后,我更新了unit of work控制器以附加UnitOfWork。这导致了

  

Newtonsoft.Json.JsonSerializationException:'反序列化数组时意外结束。路径'human.workDone',第1行,位置86。'

调查-见here-EFCore希望在构造函数中创建集合(如unitofwork.Human),所以我做到了,不再进行null的反序列化。但是,现在我有了一个自引用循环:

  

Newtonsoft.Json.JsonSerializationException:检测到类型为'PlainWorkTracker.Models.UnitOfWork'的自引用循环。路径“ human.workDone”。

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

有问题的操作属于Saving Disconnected Entities类别。

Add方法将图中当前未跟踪的所有实体标记为新实体(Added),然后SaveChanges将尝试将其插入数据库中。

您需要一种方法来告诉EF unitOfWork.Human是现有实体。实现此目的的最简单方法是在调用Attach之前将它Unchanged(将其标记为Add,即已存在)到上下文中:

db.Attach(unitOfWork.Human);
db.Add(unitOfWork);
// ...