多个添加的实体可能具有相同的主键

这是我的3个实体模型:路线,位置和位置路线。
模型

下面的方法失败,提交时得到exception:

public static Route InsertRouteIfNotExists(Guid companyId, IListLocation> locations) { //Loop on locations and insert it without commit InsertLocations(companyId, routesOrLocations); RouteRepository routeRep = new RouteRepository(); Route route = routeRep.FindRoute(companyId, locations); if (route == null) { route = new Route() { CompanyId = companyId, IsDeleted = false }; routeRep.Insert(route); LocationInRouteRepository locInRouteRep = new LocationInRouteRepository(); for (int i = 0; i < locations.Count; i++) { locInRouteRep.Insert(new LocationInRoute() { //Id = i, LocationId = locations[i].Id, Order = i, RouteId = route.Id }); } } return route; } 

在做:

 InsertRouteIfNotExists(companyId, locations); UnitOfWork.Commit(); 

我有:

无法确定“SimTaskModel.FK_T_STF_SUB_LOCATION_IN_ROUTE_T_STF_LOCATION_location_id”关系的主体结尾。 多个添加的实体可能具有相同的主键。

当分裂提交并插入到methos – 它的工作原理:

  public static Route InsertRouteIfNotExists(Guid companyId, IListLocation> locations) { //Loop on locations and insert it without commit InsertLocations(companyId, routesOrLocations); UnitOfWork.Commit(); RouteRepository routeRep = new RouteRepository(); Route route = routeRep.FindRoute(companyId, locations); if (route == null) { route = new Route() { CompanyId = companyId, IsDeleted = false }; routeRep.Insert(route); LocationInRouteRepository locInRouteRep = new LocationInRouteRepository(); for (int i = 0; i < locations.Count; i++) { locInRouteRep.Insert(new LocationInRoute() { //Id = i, LocationId = locations[i].Id, Order = i, RouteId = route.Id }); } UnitOfWork.Commit(); } return route; } 

我想在方法之外调用一次。 为什么它在第一个例子中失败,这个exception是什么意思?

该错误是由外键ID(而不是引用)无法解决。 在你的情况,你有一个LocationInRole引用一个ID为0的位置。有多个位置这个ID。

该位置还没有被分配一个ID,因为他们还没有被保存到数据库是生成ID的时候。 在第二个示例中,位置在访问其ID之前被保存,这就是为什么这是有效的。

如果您稍后想要SaveChanges,您将无法依靠位置ID来定义关系。

交换下面的行…

 LocationId = locations[i].Id 

…为了这…

 Location = locations[i] 

这些关系将基于不依赖于LocationID的对象引用。

如果这对未来的读者有任何用处,在我的情况下,这个错误是由于我的数据库(和从DB生成的模型)中configuration不正确的外键。

我有桌子:

 Parent (1-1) Child (1-many) Grandchild 

而孙子桌却无意中收到了一个外键,直到它的父母(孩子)和祖父母(父母)。 从新保存多个父实体,我收到此错误。 修复已经改正了外键。

遇到同样的错误,我高度怀疑实际问题是位置的定义。 简单地说,在EF代码首先,我打赌它看起来像这样:

 public class Location { public int Id { get; set; } ... public Location ParentLocation { get; set; } [ForeignKey("ParentLocation")] public int ParentLocationId { get; set; } } 

换句话说,在问题中,ParentLocation / ParentLocationId是回到这个表的recursion引用。

ParentLocationId不可为空。 这意味着它将被插入一个0,EF会投诉Insert,而不是当你迁移 – 即使事实是一旦迁移运行,你有一个表EF永远不会让你插入。

使recursion引用回到同一个表的唯一方法是使recursion引用为空:

 public class Location { public int Id { get; set; } ... public Location ParentLocation { get; set; } [ForeignKey("ParentLocation")] public int? ParentLocationId { get; set; } } 

注意?int

对于那些寻找这个例外的人:
在我的情况下,它没有设置所需的导航属性。

 public class Question { //... public int QuestionGridItemID { get; set; } public virtual QuestionGridItem GridItem { get; set; } //... public int? OtherQuestionID { get; set; } public Question OtherQuestion { get; set; } } //... question.OtherQuestion = otherQuestion; questionGridItem.Questions.Add(question); dataContext.SaveChanges(); //fails because otherQuestion wasn't added to //any grid item's Question collection