在Entity Framework 5代码中首先启用多个到多个代码到同一个表

时间:2015-06-27 14:23:43

标签: c# entity-framework

我是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时,每个方面都很好,我不需要在模型构建器中调整映射。只要我添加第二个导航属性,我就会收到错误。

有人可以帮忙吗?

谢谢。

格雷茨

哈利

1 个答案:

答案 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; }
}