【问题标题】:Enable multiple many to many in Entity Framework 5 code first to same table在 Entity Framework 5 代码中启用多个多对多到同一个表
【发布时间】:2015-06-27 14:23:42
【问题描述】:

我是实体框架的新手。我首先使用的是版本 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 时,一切都很好,我不需要在模型构建器中调整映射。添加第二个导航属性后,我立即收到错误消息。

有人可以帮忙吗?

谢谢。

问候

哈利

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    您可以使用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; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      相关资源
      最近更新 更多