Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架核心添加已保存的具有依赖关系的实体时抛出错误_C#_Entity Framework_Entity Framework Core - Fatal编程技术网

C# 实体框架核心添加已保存的具有依赖关系的实体时抛出错误

C# 实体框架核心添加已保存的具有依赖关系的实体时抛出错误,c#,entity-framework,entity-framework-core,C#,Entity Framework,Entity Framework Core,我有这样的想法: 班级商店 { 公共int Id{get;set;} 公共列表项{get;set;} ... } 类项目 { 公共int Id{get;set;} ... } 类存储项 { 公共int ItemId{get;set;} 公共项项{get;set;} public int StoreId{get;set;} 公共存储{get;set;} } 当我将保存的项目添加到存储区,然后尝试将其添加到数据库集时: 项目=新项目 { ... }; 使用var transaction=\u dbC

我有这样的想法:

班级商店 { 公共int Id{get;set;} 公共列表项{get;set;} ... } 类项目 { 公共int Id{get;set;} ... } 类存储项 { 公共int ItemId{get;set;} 公共项项{get;set;} public int StoreId{get;set;} 公共存储{get;set;} } 当我将保存的项目添加到存储区,然后尝试将其添加到数据库集时:

项目=新项目 { ... }; 使用var transaction=\u dbContext.Database.BeginTransaction { wait _dbContext.Items.AddAsyncitem;//该项存储在store StoreItem中 wait_dbContext.SaveChangesAsync; } ... 商店=新商店 { ... }; store.Items=新列表 { 新存储项 { ItemId=item.Id, 项目=项目, 商店, } }; 使用var transaction=\u dbContext.Database.BeginTransaction { wait_dbContext.Stores.AddAsyncstore; wait_dbContext.SaveChangesAsync; } 此代码引发以下异常:

The instance of entity type 'Item' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values.
我无法获得如何添加依赖于已保存项目的新商店

问题可在PostgresSQL上重现,以下是项目示例

大多数情况下,此异常与服务注册相关

最有可能的情况是,因为您没有提供更多信息,所以您的存储库/服务被注册为单例生命周期

->Startup.cs-services.AddSingleton

您必须将其更改为services.addScope

-二,

这可能是因为您正在跨多个DbContext对象共享实体帐户

请尝试为您的方法使用一个上下文

-三,

AsNotracking可能会有所帮助,但当您添加新实体时,我认为这不是最佳情况

在上述所有问题中,我认为问题的根源是我在第1点中解释的。

DbSet.Add将假定所有尚未跟踪的对象都是新的


如果要将项目附加为现有项目,应先执行此操作,或使用context.ChangeTracker.TrackGraph,以便指定每个对象的附加方式。

问题的原因是,在示例中,我为同一多对多关系使用了不同的对象:

var storesForItem1=新列表 { 新StoreItemEntity { ItemId=item1Entity.Id, 项目=项目1实体, Store=storeEntity, } }; var storesForItem2=新列表 { 新StoreItemEntity { ItemId=item2Entity.Id, 项目=项目2实体, Store=storeEntity, } }; var itemsForStore=新列表 {
new StoreItemEntity//store.Item从何处获得?似乎已使用实体进行设置,EF Core不会跟踪该实体,添加该实体时,也会添加store.Item,但与具有相同Id的已跟踪版本的项目冲突。这非常简单。删除第一次添加和第一次保存。否我们去彻底阅读这两种方法的文档,但是如果我先保存项,那么在一段时间后,存储决定添加已保存到_dbContext.Items的项??这是有效的用例是的,但是您应该使用不同的数据库上下文,或者您需要使用attach。为什么我不能使用相同的数据库上下文?我在相同的数据库上下文中存在差异不同的表如果只有存储区没有跟踪,但直接依赖项已经跟踪了怎么办?我正在使用EntityFrameworkCore.Sqlite执行类似的操作,但没有任何服务:wait \u dbContext.Items.AddAsyncitem;//该项存储在存储区StoreItem wait \u dbContext.saveChangesSync;…wait \u dbContext.Stores.AddAsyncstore;wait \u dbContext.SaveChangesAsync;感谢您编辑您的答案,现在请您在添加实体的地方分享您的全部代码,我必须查看AddAsyncitem-item和AddAsyncstore-store实体,以及您是如何设置的我有一个更新问题,您可以查看我是如何设置存储项的我已经准备了一个工作示例,请检查一下。是的,这个例子看起来不错……一个区别是我也异步提交,但我认为这无关紧要