使用 Fluent API EF Code First 出现约束问题

Issue coming in constraint using Fluent API EF Code First

我有2个类.

public class Om_MembershipCharges
{
    [Key]
    public Int32 MembershipChargesID { get; set; }
    public Decimal Amount { get; set; }
    public Int16 PerMonth { get; set; }
    public Int16? MemebershipTypeID { get; set; }

    public virtual Om_MembershipType MemebershipType { get; set; }
}

public class Om_MembershipType
{
    [Key]
    public Int16 MemebershipTypeID { get; set; }
    public String MemebershipType { get; set; }
    public Boolean IsDefaultMembership { get; set; }

    public virtual ICollection<Om_MembershipCharges> MembershipCharges { get; set; }
}

数据库模型如下。

public MembershipTypeMap()
{
    Property(x => x.MemebershipTypeID)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
    Property(x => x.MemebershipType)
        .IsRequired()
        .HasMaxLength(100)
        .HasColumnAnnotation
        (
            IndexAnnotation.AnnotationName,
            new IndexAnnotation
            (
                new IndexAttribute("U_MembershipType", 1) { IsUnique = true }
            )
        );

    Property(x => x.IsDefaultMembership).IsRequired();
    ToTable(clsCommon.tblMembershipType);
}


public class MembershipChargesMap : EntityTypeConfiguration<Om_MembershipCharges>
{
    public MembershipChargesMap()
    {
        Property(x => x.MembershipChargesID);

        Property(x => x.Amount).IsRequired();
        Property(x => x.PerMonth).IsRequired();
        Property(x => x.MemebershipTypeID).IsOptional();    
        ToTable(clsCommon.tblMembershipCharges);
    }
}

下面是约束条件

modelBuilder.Entity<Om_MembershipCharges>()
       .HasOptional(x => x.MemebershipType)
       .WithMany().HasForeignKey(x => x.MemebershipTypeID)
       .WillCascadeOnDelete(false);


modelBuilder.Entity<Om_MembershipCharges>()
    .HasRequired(m => m.MemebershipType).WithMany(m => m.MembershipCharges)
    .HasForeignKey(m => m.MembershipChargesID).WillCascadeOnDelete(false);

我遇到以下异常以前有人遇到过这种问题吗?

One or more validation errors were detected during model generation:

Om_MembershipCharges_MemebershipType_Source: : Multiplicity is not valid in Role 'Om_MembershipCharges_MemebershipType_Source' in relationship 'Om_MembershipCharges_MemebershipType'. Because the Dependent Role refers to the key properties, the upper bound of the multiplicity of the Dependent Role must be '1'. Om_MembershipCharges_MemebershipType_Target_Om_MembershipCharges_MemebershipType_Source: : The types of all properties in the Dependent Role of a referential constraint must be the same as the corresponding property types in the Principal Role. The type of property 'MembershipChargesID' on entity 'Om_MembershipCharges' does not match the type of property 'MemebershipTypeID' on entity 'Om_MembershipType' in the referential constraint 'Om_MembershipCharges_MemebershipType'.

你的最后一个代码片段...

modelBuilder.Entity<Om_MembershipCharges>()
    .HasRequired(m => m.MemebershipType).WithMany(m => m.MembershipCharges)
    .HasForeignKey(m => m.MembershipChargesID).WillCascadeOnDelete(false);

...覆盖之前注册的m.MembershipType,现在使它成为必需的,EF表示它的多重性应该是1,而不是0..1.

查看导航属性,映射应该是最后两个片段的合并(注意 HasOptional)。 你应该使用 MembershipTypeID 而不是 MembershipChargesID:

modelBuilder.Entity<Om_MembershipCharges>()
    .HasOptional(m => m.MemebershipType).WithMany(m => m.MembershipCharges)
    .HasForeignKey(m => m.MembershipTypeID).WillCascadeOnDelete(false);

旁注:我会将所有映射代码放入映射 类 中。保持在一起更容易维护。我认为你甚至需要这样做,因为 EF 除了通过 modelBuilder.Entity<T>.

注册类型之外不允许你注册 EntityTypeConfigurations