我在 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
引用现有的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;
}
再一次,这里没什么特别的。
如何创建工作单元并将其分配给现有人员?如果我和现有的人一起尝试,以这种方式
var humans = await Api.GetHumans();
var firstHuman = humans.First();
var unitOfWorkToCreate = new UnitOfWork() {
Name = TbInput.Text,
Human = firstHuman,
};
我收到此错误:
当 IDENTITY_INSERT 设置为 OFF 时,无法为表 'Humans' 中的标识列插入显式值
我觉得将 IDENTITY_INSERT 设置为 ON 会解决我的问题,但这不是我想要做的。在客户端中,我将选择一个现有的human
,写下 的名称unit of work
,然后创建后者。这是正确的方法吗?
编辑:按照@Ivan Stoev 的回答,我已经更新了UnitOfWork
控制器以附加unitofwork.Human
. 这导致
Newtonsoft.Json.JsonSerializationException: '反序列化数组时意外结束。路径“human.workDone”,第 1 行,位置 86。
调查 - 在这里看到- EFCore 期望human.WorkDone
在构造函数中创建集合(如),所以我做到了,并且不再反序列化空值。但是,现在我有一个自引用循环:
Newtonsoft.Json.JsonSerializationException:检测到类型为“PlainWorkTracker.Models.UnitOfWork”的自引用循环。路径“human.workDone”。
有任何想法吗?谢谢!
有问题的操作属于保存断开连接的实体类别。
Add
方法将图中当前未跟踪的所有实体标记为 new ( Added
),然后SaveChanges
尝试将它们插入数据库中。
您需要一种方法来告诉 EF 这unitOfWork.Human
是一个现有实体。实现这一点的最简单方法是在调用之前Attach
将它(将其标记为Unchanged
,即存在)到上下文Add
:
db.Attach(unitOfWork.Human);
db.Add(unitOfWork);
// ...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句