Asp.net core EntityFrameworkCore插入现有相关项

Asp.net core EntityFrameworkCore插入现有相关项,asp.net-core,entity-framework-core,asp.net-core-2.1,entity-framework-core-2.1,Asp.net Core,Entity Framework Core,Asp.net Core 2.1,Entity Framework Core 2.1,考虑 public class Item { public int Id{get;set;} public string Name{get;set;} public List<ItemTag> ItemTags{get;set;} } public class ItemTag { public int Id{get;set;} public int Name{get;set;} } AutoMapper不适合备份回持久性或域模型

考虑

 public class Item
 {
    public int Id{get;set;}
    public string Name{get;set;}
    public List<ItemTag> ItemTags{get;set;}
 }

 public class ItemTag
 {
    public int Id{get;set;}
    public int Name{get;set;}
 }

AutoMapper不适合备份回持久性或域模型。《汽车制造商》的作者

这也不能像EF(Core)那样很好地工作

根据从数据库加载的实体进行更改跟踪。更改实体值时,其状态将从
未更改
更改为
已修改
,并将生成更新方法

当您加载一个实体而没有项目关系时(使用即时加载),那么当您添加一个实体时,它将被标记为
Added
,从而在保存时插入

您还可以
附加
分离
实体

从链接的博客帖子:

Rowan Miller总结了GitHub问题中的新行为(bit.ly/295goxw):

添加:添加尚未跟踪的所有可访问实体

附加:附加每个可访问实体,可访问实体具有存储生成的密钥且未分配密钥值的情况除外;这些将被标记为已添加

更新:与“附加”相同,但实体标记为“已修改”

删除:与附加相同,然后将根标记为已删除。因为级联删除现在发生在SaveChanges上,所以这允许级联规则稍后流向实体

因此,您必须附加您的项目(如果您只想添加不带主键的新项目),或者在
DbSet
上调用
Update/UpdateRange
以更新带键的项目,并添加不带主键的项目


或者,通过设置/更改其跟踪状态来自行处理它,就像您已经做的那样。但是请记住,
Unchanged
不会更新传递的实体

要插入新的
ItemTag
,可以直接插入到
ItemTag
表中,而不反映

如下所示定义您的模型:

public class ItemTag
{
    public int Id { get; set; }
    public int Name { get; set; }
    public int ItemId { get; set; }
    public virtual Item Item { get; set; }
}
尝试为
ItemTag
设置
ItemTag的
ItemId
,为
项目插入新的
ItemTag

如果您喜欢使用
ItemTag
插入
Item
,可以尝试使用描述如何操作模型的
JsonPatchDocument

试着参考一下


对于
JsonPatchDocument
,您需要在客户端生成
JsonPatchDocument
。尝试参考。

简单修复:不要使用AutoMapper。AutoMapper的作者多次指出,它不适合这种映射。只有持久性模型->DTO或ViewModel和/或域模型->ViewModel/DTO。永远不要反过来。EF Core通过引用跟踪实体,automapper创建新引用,因此issue@Tseng好啊我没有意识到这一点。所以我应该手工编写从输入到实际的映射?否。AM。集合可以为您添加对AM的支持。@LucianBargaoanu,您能解释一下吗?也许是一个例子?@LucianBargaoanu,似乎还没有人支持EF Core:谢谢你的回答!当我们要插入现有的相关项时,您能告诉我们代码应该是什么样子吗?我的意思是,请在DbSet上显示call Update/UpdateRange的代码,用一个键更新那些,然后添加没有键的?
public class ItemTag
{
    public int Id { get; set; }
    public int Name { get; set; }
    public int ItemId { get; set; }
    public virtual Item Item { get; set; }
}