Entity framework Can';t使用EF Core在ASP.NET Core中创建相关实体
我在EntityFrameworkCore2.0中创建相关实体时遇到问题。我刚刚创建了一个解决方案,由一个Asp.Net核心后端项目和一个充当客户端的UWP项目组成。两种解决方案共享一个模型。这两种模式是:Entity framework Can';t使用EF Core在ASP.NET Core中创建相关实体,entity-framework,azure,asp.net-core,entity-framework-core,ef-core-2.0,Entity Framework,Azure,Asp.net Core,Entity Framework Core,Ef Core 2.0,我在EntityFrameworkCore2.0中创建相关实体时遇到问题。我刚刚创建了一个解决方案,由一个Asp.Net核心后端项目和一个充当客户端的UWP项目组成。两种解决方案共享一个模型。这两种模式是: public class UnitOfWork { public int UnitOfWorkId { get; set; } public string Name { get; set; } public Human Human { get; set; } } p
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; }
}
再说一次,这里没什么特别的
如何创建工作单元并将其分配给现有人员?如果我试着用一个现存的人类,用这种方式
var humans = await Api.GetHumans();
var firstHuman = humans.First();
var unitOfWorkToCreate = new UnitOfWork() {
Name = TbInput.Text,
Human = firstHuman,
};
我得到这个错误:
当identity\u insert设置为OFF时,无法在表“Humans”中为identity列插入显式值
我觉得将IDENTITY_INSERT设置为ON可以解决我的问题,但这不是我想要做的。在客户机中,我将选择一个现有的人员
,为工作单元写下一个名称
,然后创建后者。这是正确的方法吗
编辑:在@Ivan Stoev的回答之后,我更新了UnitOfWork
控制器以附加UnitOfWork.Human
。这导致了
Newtonsoft.Json.JsonSerializationException:'反序列化数组时意外结束。路径“human.WorkOne”,第1行,位置86
expndtw-seen-EFCore希望在构造函数中创建集合(比如human.WorkDone
),所以我就这样做了,不再进行空值反序列化。但是,现在我有了一个自引用循环:
Newtonsoft.Json.JsonSerializationException:检测到类型为“PlainWorkTracker.Models.UnitOfWork”的自引用循环。路径“human.workDone”
有什么想法吗?谢谢 正在讨论的操作属于这一类
Add
方法将图形中当前未跟踪的所有实体标记为新(Added
),然后SaveChanges
将尝试将它们插入数据库
您需要一种方法告诉EF,unitOfWork.Human
是一个现有实体。实现这一点的最简单方法是在调用Add
之前,将附加到上下文中(将其标记为未更改
,即现有):
db.Attach(unitOfWork.Human);
db.Add(unitOfWork);
// ...
谢谢但现在我遇到了一个Newtonsoft.Json.JsonSerializationException:“反序列化数组时意外结束。路径“human.workDone”,第1行,第86位。
。正如你所说,我在我的问题中的代码中添加了附加行,这是不同的。如果点击了Post
方法并且unitOfWork.Human.WorkDone
包含项目,您可以进行调试吗?我刚刚更新了我的原始问题,请重新讨论,正如我所说的,对于返回此类实体的操作,您需要解决另一个问题。您可以在上面找到许多类似的帖子,因此,您基本上需要配置序列化程序的ReferenceLoopHandling
属性,或者使用DTOs/ViewModels进行切换。
db.Attach(unitOfWork.Human);
db.Add(unitOfWork);
// ...