我在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”。
有什么想法吗?谢谢!
答案 0 :(得分:1)
有问题的操作属于Saving Disconnected Entities类别。
Add
方法将图中当前未跟踪的所有实体标记为新实体(Added
),然后SaveChanges
将尝试将其插入数据库中。
您需要一种方法来告诉EF unitOfWork.Human
是现有实体。实现此目的的最简单方法是在调用Attach
之前将它Unchanged
(将其标记为Add
,即已存在)到上下文中:
db.Attach(unitOfWork.Human);
db.Add(unitOfWork);
// ...