首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架允许在多到多关系中重复。

实体框架允许在多到多关系中重复。
EN

Stack Overflow用户
提问于 2015-09-17 19:09:14
回答 3查看 1.6K关注 0票数 1

我有两个对象-父母和孩子在关系中多对多,问题是,一个父母可以有两个相同的孩子,但EF节省这种关系只有一次。

我只找到了两个可行的解决方案:

  1. count列添加到表中并手动填充
  2. 不是用多对多,而是把它分成一对多和多对一,但我不喜欢这个解决方案,因为我希望有一些更简单的解决方案。

你能帮帮我吗?

编辑:连接表示例:

1-1

1-1

1-2

1-3

2-3

代码:模型

代码语言:javascript
复制
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上下文

代码语言:javascript
复制
modelBuilder.Entity<Item>().
HasMany(i => i.childs).
WithMany(i2 => i2.parents).
Map(
m =>
{
m.MapLeftKey("parentId");
m.MapRightKey("childId");
m.ToTable("itemRelationship");
});
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-18 07:31:19

关系数据库是关于的。集合是标识实体的不同集合。然而,你的接线桌,你想象它的方式,是一个。这违反了关系理论的基本原理。像往常一样,一次违反会引起其他违反。下一个是没有唯一的主键,即标识。不能通过外键引用这些连接记录,如果你想要的话,那是另一个。

所以别这么做。

我认为这里的错误是,您希望用创建的行数来表示"A具有n实例的B“这一事实。但是这个数字是关联的一个属性。

让我们看一个例子:文章和单词。

你可以用一个纯粹的多到多的关联来表达ArticleWord之间的关系.这个联想表示:这个Article包含这些Words。注意指示代词(这个,这些)。它们意味着身份。在数据库中,每篇文章都有一个实例,每个单词都有一个实例。

如果要存储单词发生的次数,则必须将该数字作为属性添加到关联中。一个事实从来不是由许多行建模的。单行描述了“此Article有该Wordn出现”的事实。在实体框架中,这意味着关联成为类模型中的一个类,例如ArticleWord。该关联的多重性为Article 1-n ArticleWord n-1 Word.

票数 1
EN

Stack Overflow用户

发布于 2015-09-17 20:09:35

一种解决方案是首先定义关系表。该表的主键将是它包含的2个外键的组合,它将允许该复合键看起来如下:

1-1,

2-1,

2-2

但不是:

1-1

1-1

1-2

2-1

票数 0
EN

Stack Overflow用户

发布于 2019-02-15 00:12:09

我同意Gert关于关系数据是集合的核心概念。为此,我建议你找到另一件事,使他们独特。例如添加时间戳或按日期创建。如果你真的需要复制的话。但这再次回到关系数据正被规范化为集合。下面是关于DB规范化的链接

代码语言:javascript
复制
[Key, Column(Order =2), DatabaseGenerated(DatabaseGeneratedOption.None)]
public DateTime DateCreated { get; set; }

[Timestamp]
public byte[] RowVersion { get; set; }

时间戳主要用于并发,但您可能可以将它们添加到密钥中。

我也很好奇在很多表中需要重复的场景是什么。只有两个列是完全相同的两个记录,这意味着这个关系被表达了两次,它不会创建一个额外的关系。

这就像说我姐姐是我妹妹,说她是我妹妹没有改变她是我妹妹的事实,它没有给我两个她,她还在收藏中,她不能因为数据库规范化而两次出现在这个集合中。我可以数两次她在我的收藏,但这并不改变的事实,只有一个她(在另一个表)。如果需要两个人的话,应该有另一张有不同身份的记录。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32638208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档