首先,将两个导航属性映射到相同的对象类型



如果我有一个User类,它有以下属性:

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

我怎么能得到这个通过流畅的API?当我试着运行这个时,它说:

在表'Users'上引入FOREIGN KEY约束可能导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他外键约束。不能产生约束。见前面的错误。

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

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

使用代码优先流畅配置删除一个或两个关系上的级联删除:

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

最新更新