I';I’我对联接表有点困惑
本文关键字: | 更新日期: 2023-09-27 18:00:00
所以我正在研究一些实体框架代码优先。一般来说,我对数据库关系映射很陌生。我已经为我的问题创建了一个通用的例子,我将在下面发布代码。
这个场景是一个简单的论坛投票。用户可以通过选择一个选项(或多个投票选项)对投票进行投票。
Poll和Option有一对多的关系。Option和User具有多对多的关系。Poll和User之间存在多对多的关系。
但民意调查的用户基本上是根据选项的用户编制的,因为要对某个选项进行投票,你必须对民意调查进行投票,反之亦然。所以基本上,我想它可以被描述为一个附加了Options‘Polls’主键的User/Options联接表。或者它可以有点像一个带有Option的复杂类型数组的User/Opoll联接表。
无论如何,我一直在使用Fluent API(DbModelBuilder),但我还没有得到我想要的东西。帮助
轮询.cs
public class Poll
{
public long ID { get; private set; }
public ICollection<Option> Options { get; set; }
public ICollection<User> Users { get; set; }
}
选项.cs
public class Option
{
public long ID { get; private set; }
public long PollID { get; set; }
public ICollection<User> Users { get; set; }
}
用户.cs
public class User {
public long ID { get; private set; }
public ICollection<Option> Polls { get; set; }
public ICollection<User> Options { get; set; }
{
为什么需要Poll
和User
之间的连接?这是多余的信息——您总是可以通过Options
查询来获得这些数据。如果你真的想让它引入第四个名为Vote
的实体,它将保留PollId
、UserId
和OptionId
。您的应用程序逻辑必须确保使用OptionId
和PollId
的有效组合。解决这一问题的另一种方法是在由OptionId
和PollId
组成的Option
中创建复合密钥。然后您将在User
和Option
之间创建多对多关系。它将部分解决用户对轮询依赖性的需求,并完全消除检查OptionId
和PollId
的有效对的问题。