EF 代码首先将实体关系 2 个字段声明到同一集合
本文关键字:声明 字段 集合 代码 关系 实体 EF | 更新日期: 2023-09-27 18:37:20
我正在使用带有代码优先的实体框架。我的数据库中有一个表,用于存储用户之间的关系。表结构看起来很像这样:
-
RequestID
-
UserFromID
-
UserToID
UserFromID
和 UserToID
都是我的 User 表的外键。
在我的用户实体中,我有一个名为Relationships
设置的虚拟属性。我希望此属性是上面列出的表中所有RelationshipRequests
的集合,其中当前用户UserID
是UserFromID
或UserToID
。
这些是我在上下文中的绑定:
modelBuilder.Entity<UserProfile>()
.HasMany(e => e.Relationships).WithRequired(e => e.UserFrom)
.HasForeignKey(e => e.UserFromID).WillCascadeOnDelete(false);
modelBuilder.Entity<UserProfile>()
.HasMany(e => e.Relationships).WithRequired(e => e.UserTo)
.HasForeignKey(e => e.UserToID).WillCascadeOnDelete(true);
但是,一旦为用户检索了关系,集合中唯一的关系就是用户 ID 是UserToID
的关系。我尝试交换它们,在这种情况下,集合仅包含用户ID为UserFromID
的关系。似乎第二个绑定正在覆盖第一个绑定,而不是像我预期的那样附加到它。我显然做错了。我的问题,有没有另一种方法可以执行此绑定,以便两个键都按照我想要的方式绑定,或者这是我必须以另一种方式实现的东西?
谢谢!
问题是您使用了两次相同的属性,当然,第二个绑定会覆盖第一个绑定。您必须在用户模型上创建 2 个导航属性,每个外键一个
modelBuilder.Entity<UserProfile>()
.HasMany(e => e.FromRelationships).WithRequired(e => e.UserFrom)
.HasForeignKey(e => e.UserFromID).WillCascadeOnDelete(false);
modelBuilder.Entity<UserProfile>()
.HasMany(e => e.ToRelationships).WithRequired(e => e.UserTo)
.HasForeignKey(e => e.UserToID).WillCascadeOnDelete(true);
在模型上,您将拥有类似的东西
public virtual List<Relationships> FromRelationships { get; set; }
public virtual List<Relationships> ToRelationships { get; set; }