使用 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>
.
注册类型之外不允许你注册 EntityTypeConfiguration
s
我有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>
.
EntityTypeConfiguration
s