【问题标题】:Entity Framework Table Per Hierarchy Inserting Multiple Id Columns每个层次结构的实体框架表插入多个 Id 列
【发布时间】:2015-08-14 21:21:53
【问题描述】:

我认真地花了两个工作日尝试从数据库优先到代码优先的 TPH 设置。我得到的错误类似于“无效的列名 Entity_EntityId/Entity_Entity_Id1”

我已经草拟了一个非常基本的问题再现,如下所示:

      internal class Program
      {
        private static void Main(string[] args)
        {
          using (var context = new Context())
          {
            var baseClass = new Base {Name = "Test"};
            context.BaseClasses.Add(baseClass);
            context.SaveChanges();
            var baseClasses = context.BaseClasses.ToList();
          }
        }
      }

上下文:

      public class Context : DbContext
      {
        public Context() : base("TPH")
        {
        }

        public DbSet<Base> BaseClasses { get; set; }
        public DbSet<Derived> DervDerivedClasses { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }
      }

映射:

      public class BaseMap : EntityTypeConfiguration<Base>
      {
        public BaseMap()
        {
          HasKey(b => b.Id);

          Property(b => b.Name);
          HasOptional(b => b.AnotherClass)
            .WithMany(b => b.Bases)
            .HasForeignKey(b => b.AnotherClassId);

          Map(b => b.Requires("Disc").HasValue(1));
        }
      }

      public class DerivedMap : EntityTypeConfiguration<Derived>
      {
        public DerivedMap()
        {
          HasKey(b => b.Id);

          Property(b => b.Name);
          HasOptional(b => b.AnotherClass)
            .WithMany(b => b.Deriveds)
            .HasForeignKey(b => b.AnotherClassId);

          Map(b => b.Requires("Disc").HasValue(2));
        }
      }

      public class SecondDerivedMap : EntityTypeConfiguration<SecondDerived>
      {
        public SecondDerivedMap()
        {
          HasKey(b => b.Id);

          Property(b => b.Name);

          HasOptional(b => b.AnotherClass)
            .WithMany(b => b.SecondDeriveds)
            .HasForeignKey(b => b.AnotherClassId);

          Map(b => b.Requires("Disc").HasValue(3));
        }
      }

实体:

      public class Base
      {
        public int Id { get; set; }
        public string Name { get; set; }
        public int? AnotherClassId { get; set; }
        public AnotherClass AnotherClass { get; set; }
      }

      public class Derived : Base
      {
      }

      public class SecondDerived : Base
      {
      }

      public class AnotherClass
      {
        public int Id { get; set; }
        public ICollection<Base> Bases { get; set; }
        public ICollection<Derived> Deriveds { get; set; }
        public ICollection<SecondDerived> SecondDeriveds { get; set; }
      }

如何让表格只有一个“AnotherClassId”?

【问题讨论】:

    标签: entity-framework ef-code-first entity-framework-6 code-first table-per-hierarchy


    【解决方案1】:

    每个关系的每个实体只应该有一个导航属性——而你有三个(BasesDerivedsSecondDeriveds)。 EF 看到这些属性并认为AnotherClassBase 层次结构中的各种类之间存在三种不同的一对多关联。

    如果您想从AnotherClass 获取相关Derived 实体的集合,您应该使用anotherClassEntity.Bases.OfType&lt;Derived&gt;() 之类的东西。

    【讨论】:

    • 不撒谎,我刚醒来并以“哦,好吧,没有废话”的方式得出了这个确切的结论,感谢您的肯定和您的洞察力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多