我有两个对象-父母和孩子在关系中多对多,问题是,一个父母可以有两个相同的孩子,但EF节省这种关系只有一次。
我只找到了两个可行的解决方案:
count列添加到表中并手动填充你能帮帮我吗?
编辑:连接表示例:
1-1
1-1
1-2
1-3
2-3
代码:模型
public class Item
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int id { get; set; }
public virtual ICollection<Item> childs { get; set; }
public virtual ICollection<Item> parents { get; set; }
}DB上下文
modelBuilder.Entity<Item>().
HasMany(i => i.childs).
WithMany(i2 => i2.parents).
Map(
m =>
{
m.MapLeftKey("parentId");
m.MapRightKey("childId");
m.ToTable("itemRelationship");
});发布于 2015-09-18 07:31:19
关系数据库是关于集的。集合是标识实体的不同集合。然而,你的接线桌,你想象它的方式,是一个包。这违反了关系理论的基本原理。像往常一样,一次违反会引起其他违反。下一个是没有唯一的主键,即标识。不能通过外键引用这些连接记录,如果你想要的话,那是另一个。
所以别这么做。
我认为这里的错误是,您希望用创建的行数来表示"A具有n实例的B“这一事实。但是这个数字是关联的一个属性。
让我们看一个例子:文章和单词。
你可以用一个纯粹的多到多的关联来表达Article和Word之间的关系.这个联想表示:这个Article包含这些Words。注意指示代词(这个,这些)。它们意味着身份。在数据库中,每篇文章都有一个实例,每个单词都有一个实例。
如果要存储单词发生的次数,则必须将该数字作为属性添加到关联中。一个事实从来不是由许多行建模的。单行描述了“此Article有该Word的n出现”的事实。在实体框架中,这意味着关联成为类模型中的一个类,例如ArticleWord。该关联的多重性为Article 1-n ArticleWord n-1 Word.
发布于 2015-09-17 20:09:35
一种解决方案是首先定义关系表。该表的主键将是它包含的2个外键的组合,它将允许该复合键看起来如下:
1-1,
2-1,
2-2
但不是:
1-1
1-1
1-2
2-1
发布于 2019-02-15 00:12:09
我同意Gert关于关系数据是集合的核心概念。为此,我建议你找到另一件事,使他们独特。例如添加时间戳或按日期创建。如果你真的需要复制的话。但这再次回到关系数据正被规范化为集合。下面是关于DB规范化的链接
[Key, Column(Order =2), DatabaseGenerated(DatabaseGeneratedOption.None)]
public DateTime DateCreated { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; }时间戳主要用于并发,但您可能可以将它们添加到密钥中。
我也很好奇在很多表中需要重复的场景是什么。只有两个列是完全相同的两个记录,这意味着这个关系被表达了两次,它不会创建一个额外的关系。
这就像说我姐姐是我妹妹,说她是我妹妹没有改变她是我妹妹的事实,它没有给我两个她,她还在收藏中,她不能因为数据库规范化而两次出现在这个集合中。我可以数两次她在我的收藏,但这并不改变的事实,只有一个她(在另一个表)。如果需要两个人的话,应该有另一张有不同身份的记录。
https://stackoverflow.com/questions/32638208
复制相似问题