EF 6.1.3多重性冲突

时间:2017-06-02 12:48:24

标签: entity-framework entity-framework-6 ef-fluent-api

我尝试运行add-migration脚本时遇到错误。 错误是:

Domain.DataAccessLayer.AllRoutines_Product: : Multiplicity conflicts with the referential constraint in Role 'AllRoutines_Product_Target' in relationship 'AllRoutines_Product'. Because all of the properties in the Dependent Role are non-nullable, multiplicity of the Principal Role must be '1'.

我无法弄清楚我做错了什么。我有AllRoutines和Product实体。 AllRoutines可以有0个或1个产品。这是我的AllRoutines类(为清楚起见,省略了一些代码):

public class AllRoutines
{
    [Key]

    public long Id { get; set; }

    public string Name { get; set; }

    public string Tags { get; set; }


    public int? RoutineLevelId { get; set; }

    public RoutineLevel RoutineLevel { get; set; }


    public Guid? ProductId { get; set; }
    public virtual Product Product { get; set; }

}

这是FluetnApi映射(同样省略了一些代码):

public void MapRoutine(DbModelBuilder modelBuilder)
    {

        modelBuilder.Entity<RoutineLevel>().HasKey(r => r.RoutineLevelId);
        modelBuilder.Entity<AllRoutines>()
            .HasKey(r => r.Id)
            .Property(r => r.Id)
            .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);


        modelBuilder.Entity<AllRoutines>()
            .HasOptional(r => r.RoutineLevel)
            .WithMany()
            .HasForeignKey(r => r.RoutineLevelId);



        modelBuilder.Entity<AllRoutines>().HasOptional(c => c.Product)
            .WithMany()
            .HasForeignKey(c => c.ProductId)
            .WillCascadeOnDelete(false);
    }

此外,我不确定这是否重要,但也有类CustomRoutine继承AllRoutines,如下所示:

 public class CustomRoutine : AllRoutines
 {

    public DateTime DateCreated { get; set; }


    public string UserId { get; set; }

    public User UserWhoCreatedRoutine { get; set; }

}

继承方法是Table per Hierarchy。

我尝试添加映射配置:

 modelBuilder.Entity<CustomRoutine>().HasOptional(c => c.Product)
            .WithMany()
            .HasForeignKey(c => c.ProductId)
            .WillCascadeOnDelete(false);

但错误是一样的。我不确定为什么会发生这种情况,因为正如您在代码中看到的那样,对于RoutineLevel已经完成了相同的映射(没有任何问题),我也有相同的Product和其他类的映射,同样没有问题。

修改 这里也是产品类:

public class Product
{
    public Guid Id { get; protected set; }
    public string Code { get; set; }
    public string Name { get; set; }
    public bool IsFree { get; set; }
    public ICollection<SubscriptionProduct> SubscriptionProducts { get; set; }

}

和FluentAPI映射:

 modelBuilder.Entity<Product>()
            .HasKey(p => p.Id);
        modelBuilder.Entity<Product>()
            .Property(p => p.Code)
            .IsRequired()
            .HasMaxLength(10);

        modelBuilder.Entity<Product>()
            .Property(p => p.Name)
            .IsRequired()
            .HasMaxLength(100);
        modelBuilder.Entity<Product>()
            .HasMany(p => p.SubscriptionProducts)
            .WithRequired()
            .HasForeignKey(p => p.ProductId)
            .WillCascadeOnDelete(true);

0 个答案:

没有答案