繁体   English   中英

Ef6,多对多,插入和主键

[英]Ef6, Many to many, Inserts and Primary keys

对于在多对多关系中的联结表中填充正确的值,我遇到了问题。 在下图中,我简化了我想做的事情。 “左侧的表”在数据库中具有我要使用的值。 右边的表即将接收新记录。 它具有“交汇点”表的导航属性,左侧的表也是如此。 联结表的背面都有两个表的导航属性,并将它们设置为required

在此处输入图片说明

在右侧表中创建新记录时,我还将在联结表中添加到记录中。 已知TOL_ID是因为它已保存在数据库中,但是TOR_ID将要创建,因此未知。 当我尝试在我的上下文中调用SaveChanges时,它将尝试先保存联结表记录,然后再为右侧的记录填充TOR_ID。 虽然我将导航属性标记为Required会使EF理解创建联结表行之前TOR_ID必须存在。 相反,它尝试插入现有的TOL_ID和0,这在尝试在连接到同一TOL_ID的正确记录上插入许多表时会出现冲突。

注意:不能先保存TOR_ID,然后再与联结记录进行连接,因为联结表记录的创建是“ Slowing Changeing Dimensions ”类型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);

如果您遵循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

很抱歉花您的时间。 经过一番调查后,我注意到连接表的假定复合唯一索引(TOL_ID和TOR_ID)被设置为错误。 而是将两个单独的唯一索引应用于TOL_ID和TOR_ID,一旦这两个值之一出现两次,就会导致约束冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM