【发布时间】:2018-10-22 12:55:00
【问题描述】:
我有一个实体User,它有两个属性CreatedBy 和UpdatedBy 都引用User。默认情况下,EF 假定这两者是一对一的关系。我收到以下错误消息:
消息:System.InvalidOperationException:无法确定在“User.CreatedBy”和“User.UpdatedBy”之间检测到的一对一关系的子/依赖方。要识别关系的子/依赖方,请配置外键属性。如果这些导航不应该是同一关系的一部分,请在不指定相反的情况下配置它们。详情请见http://go.microsoft.com/fwlink/?LinkId=724062。
目前,我有这样的课程:
public class User
{
public int Id { get; set; }
public int? CreatedById { get; set; }
public User CreatedBy { get; set; }
public int? UpdatedById { get; set; }
public User UpdatedBy { get; set; }
}
基本上,这是我正在尝试的:
- 创建的和更新的不会相互关联(不需要导航/反向属性)
- 任何数量的用户都可以拥有相同的
CreatedBy,任何数量的用户都可以拥有相同的UpdatedBy。
如何让 EF 忽略导航属性?我拥有CreatedBy 的主要原因是我以后可以使用Include(u => u.CreatedBy)。我知道使用IEnumerable<User> AllCreatedUsers 属性可以解决这个问题,但我不想为我的实体中的每个人创建一个IEnumerable。有什么办法可以用流畅的 API 做到这一点?
这是我尝试过的:
modelBuilder.Entity<User>()
.Property<IEnumerable<User>>("AllCreatedUsers");
modelBuilder.Entity<User>().HasOne(u => u.CreatedBy)
.WithMany(u => EF.Property<IEnumerable<User>>(u, "AllCreatedUsers"));
【问题讨论】:
-
尝试在
UpdatedBy和CreatedBy上使用ForeignKey数据注释 -
为什么要 EF 在添加导航属性时忽略它,以便拥有 EF 的导航属性?
-
@viveknuna 是的.. 我在注释和流畅的 API 中尝试了
ForeignKey -
@Progman 考虑到我永远不会使用这样的
IEnumerable,所以在一个类中拥有这么多未使用的属性是没有意义的。 -
@viveknuna 是的。再次尝试
ForeignKey工作。上次我可能只将 fk 用于一个属性。两者都使用它。
标签: c# entity-framework-core ef-fluent-api ef-core-2.0 navigation-properties