2017-02-16 65 views
0

我有一个问题,在多对多关系中填充联结表中的正确值。在下面的图片中,我简化了我想要做的事情。 “左边的表”在我想要使用的数据库中有值。右侧的表格即将收到新记录。它有一个到Junction表的导航属性,左侧的表也是如此。联结表具有导航属性到其后部的两个表,并且它们被设置为要求Ef6,多对多,插入和主键

enter image description here

当我创建在右侧的表中的新记录,我也给它添加在接线表中记录。 TOL_ID是已知的,因为它保存在数据库中,但TOR_ID即将创建,因此未知。当我尝试在我的上下文中调用SaveChanges时,它会尝试在TOR_ID填充右边的记录之前先保存联结表记录。尽管如此,将导航属性标记为要求将使EF知道在创建联结表行之前TOR_ID必须存在。相反,它试图插入一个现有的TOL_ID和0,当试图在连接到相同TOL_ID的正确记录上插入许多表时,这会导致违规。

注:第一保存TOR_IDs,然后用结记录连接是不是一种选择,因为交界处表记录的创建是一个“Slowly changing dimension”式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

你能提供正在处理记录的代码吗? –

+0

@ S.Dav我会在上面发表。 – Midas

+0

您必须将JT_ID添加到TOR和TOL表中。 – Mehmet

回答

1

如果你按照下面的类代码首先会很有帮助

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

如果按照数据库第一种方法,使FK在加入表并尝试更改id名称TOLId,TORId

0

对不起,我花了你的时间。经过一番调查后,我注意到联结表假设的复合唯一索引(TOL_ID和TOR_ID)被设置错误。相反,两个单独的唯一索引已应用于TOL_ID和TOR_ID,一旦这两个值中的一个出现两次,就会导致违反约束。