Ef6,多对多,插入和主键

时间:2017-02-16 08:03:44

标签: c# database entity-framework

我在连接表中填充正确的值以解决多对多关系时遇到问题。在下图中,我简化了我想要做的事情。 "左边的表"具有我想要使用的数据库中的值。右边的表即将收到新的记录。它有一个到Junction表的导航属性,对于左边的表也是如此。联结表的后方有两个表的导航属性,它们被设置为必需

enter image description here

当我在右边的表中创建新记录时,我还在联结表中添加了记录。 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);

2 个答案:

答案 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,只要这两个值中的一个出现两次就会导致约束违规。