EF Code First,将两个导航属性映射到同一对象类型

时间:2013-06-19 20:12:23

标签: entity-framework ef-code-first entity-framework-mapping

如果我有一个具有这些属性的User类:

    public Guid UserPreferenceId { get; set; }
    public virtual DefaultUserPreference UserPreference { get; set; }

    public Guid SecondaryUserPreferenceId { get; set; }
    public virtual DefaultUserPreference SecondaryUserPreference { get; set; }

如何通过流畅的API获取此信息?当我尝试运行时,它说:

  

在表格'用户'上引入FOREIGN KEY约束。可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。   无法创建约束。查看以前的错误。

我已经看过其中一些问题,但它们总是涉及一个导航属性和一个集合。这种关系也是单向的,但如果必须的话,它可以是双向的,不确定是否重要。

1 个答案:

答案 0 :(得分:5)

实体框架默认创建与Cascade Delete on的关系。创建从一个实体到另一个实体的两个关系会尝试创建两个级联删除关系,数据库会抛出您看到的错误。

使用Code-First Fluent配置删除一个或两个关系上的级联删除:

modelBuilder.Entity<User>()
    .HasOptional(u => u.UserPreference)
    .WithMany()
    .WillCascadeOnDelete(false);
modelBuilder.Entity<User>()
    .HasOptional(u => u.SecondaryUserPreference)
    .WithMany()
    .WillCascadeOnDelete(false);