我在连接表中填充正确的值以解决多对多关系时遇到问题。在下图中,我简化了我想要做的事情。 "左边的表"具有我想要使用的数据库中的值。右边的表即将收到新的记录。它有一个到Junction表的导航属性,对于左边的表也是如此。联结表的后方有两个表的导航属性,它们被设置为必需。
当我在右边的表中创建新记录时,我还在联结表中添加了记录。 TOL_ID是已知的,因为它保存在数据库中,但即将创建TOR_ID,因此未知。当我尝试在我的上下文中调用 SaveChanges 时,它会先尝试保存联结表记录,然后再为右侧的记录填充TOR_ID。我将导航属性标记为必需会使EF了解在创建联结表行之前必须存在TOR_ID。相反,它会尝试插入现有的TOL_ID和0,这会在尝试在连接到同一TOL_ID的正确记录上插入许多表时产生违规。
注意:首先保存TOR_ID然后连接结点记录不是一个选项,因为联结表记录的创建是" Slowly changing dimension&#的一部分34; 6型流程。
这就是代码中的真实情况:
// The newRating is the new object corresponding the Table on the right
var newRating = new ModuleRating()
{
// The moduleRating.RatedDriveUnit already exists in the db
RatedDriveUnit = moduleRating.RatedDriveUnit
};
newModule.Ratings.Add(newRating);
答案 0 :(得分:1)
如果您遵循Code First,以下课程将有所帮助
public class TOL
{
[Key]
public int TOL_ID { get; set; }
public int Col1 { get; set; }
public ICollection<TOR> Tors { get; set; }
}
public class TOR
{
[Key]
public int TOR_ID { get; set; }
public int Col1 { get; set; }
public ICollection<TOL> Tols { get; set; }
}
public class TolTorContext : DbContext
{
public DbSet<TOL> Tols { get; set; }
public DbSet<TOR> Tors { get; set; }
}
如果您遵循数据库优先方法,请在Join Table中创建FK并尝试更改ID名称TOLId,TORId
答案 1 :(得分:0)
我很抱歉花时间。经过一些调查后,我注意到联结表的假定复合唯一索引(TOL_ID和TOR_ID)设置错误。相反,两个独立的唯一索引已应用于TOL_ID和TOR_ID,只要这两个值中的一个出现两次就会导致约束违规。