Entity framework Can';t使用EF Core在ASP.NET Core中创建相关实体

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

我在EntityFrameworkCore2.0中创建相关实体时遇到问题。我刚刚创建了一个解决方案,由一个Asp.Net核心后端项目和一个充当客户端的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; }
}
再说一次,这里没什么特别的

如何创建工作单元并将其分配给现有人员?如果我试着用一个现存的人类,用这种方式

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);
// ...