我是Entity Framework的新手。我首先使用的是第5版代码。
我有一个模特:
class RebateBase
{
public int ID { get; set; }
public RebateType RebateType { get; set; }
public virtual ICollection<Customer> Customers { get; set; }
public virtual ICollection<TurnoverClassification> AvailableTurnoverClassifications { get; set; }
public virtual ICollection<TurnoverClassification> EnabledTurnoverClassifications { get; set; }
public RebateBase()
{
if (AvailableTurnoverClassifications == null)
{
AvailableTurnoverClassifications = new List<TurnoverClassification>();
}
if (EnabledTurnoverClassifications == null)
{
EnabledTurnoverClassifications = new List<TurnoverClassification>();
}
if (Customers == null)
{
Customers = new List<Customer>();
}
}
和模型
class TurnoverClassification
{
public string Name { get; set; }
public virtual ICollection<RebateBase> RebateBases{ get; set; }
[Key]
public int NumericalValue { get; set; }
}
我已尝试使用和不使用
初始化数据 protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<RebateBase>()
.HasMany<TurnoverClassification>(rb => rb.AvailableTurnoverClassifications)
.WithMany(tc => tc.RebateBases)
.Map(rt =>
{
rt.MapLeftKey("RebateID");
rt.MapRightKey("TurnoverID");
rt.ToTable("RebateBase_AvailableTurnoverClassifications");
});
modelBuilder.Entity<RebateBase>()
.HasMany<TurnoverClassification>(rb => rb.EnabledTurnoverClassifications)
.WithMany(tc => tc.RebateBases)
.Map(rt =>
{
rt.MapLeftKey("RebateID");
rt.MapRightKey("TurnoverID");
rt.ToTable("RebateBase_EnabledTurnoverClassifications");
});
但它不起作用。使用上层方法我得到错误:
指定的架构无效。错误:(9,6):错误0040:输入 RebateBase_AvailableTurnoverClassifications未在中定义 命名空间CustomerConfiguration.Datalayer(Alias = Self)。
当我删除第二个导航属性enabledturnoverClassifications时,每个方面都很好,我不需要在模型构建器中调整映射。只要我添加第二个导航属性,我就会收到错误。
有人可以帮忙吗?
谢谢。
格雷茨
哈利
答案 0 :(得分:0)
您可以使用InverseProperty
属性在TurnoverClassification
类中指定相应的集合,以启用多个多对多关系。 this的答案包含EF中多个多对多关系的示例。
我使用指定的Enable-Migrations进行了测试,并创建了正确的关系表。
class RebateBase
{
public int ID { get; set; }
public RebateType RebateType { get; set; }
public virtual ICollection<Customer> Customers { get; set; }
[InverseProperty("RebateBasesAvailable")]
public virtual ICollection<TurnoverClassification> AvailableTurnoverClassifications { get; set; }
[InverseProperty("RebateBasesEnabled")]
public virtual ICollection<TurnoverClassification> EnabledTurnoverClassifications { get; set; }
public RebateBase()
{
if (AvailableTurnoverClassifications == null)
{
AvailableTurnoverClassifications = new List<TurnoverClassification>();
}
if (EnabledTurnoverClassifications == null)
{
EnabledTurnoverClassifications = new List<TurnoverClassification>();
}
if (Customers == null)
{
Customers = new List<Customer>();
}
}
模型
class TurnoverClassification
{
public string Name { get; set; }
public virtual ICollection<RebateBase> RebateBasesAvailable{ get; set; }
public virtual ICollection<RebateBase> RebateBasesEnabled{ get; set; }
[Key]
public int NumericalValue { get; set; }
}