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; }
}