代码之家  ›  专栏  ›  技术社区  ›  Chazt3n Darius Kucinskas

每个层次结构的实体框架表插入多个Id列

  •  1
  • Chazt3n Darius Kucinskas  · 技术社区  · 10 年前

    我认真地花了两个工作日,试图将TPH设置从“数据库优先”设置为“代码优先”。我得到的错误类似于“无效列名Entity_EntityId/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”

    1 回复  |  直到 10 年前
        1
  •  2
  •   jjj    10 年前

    每个关系的每个实体只应有一个导航属性,而您有三个( Bases , Deriveds SecondDeriveds ). EF看到了这些属性,认为它们之间有三种不同的一对多关联 AnotherClass 以及 Base 等级制度

    如果您想获取相关的 Derived 来自的实体 另一类 ,你应该使用 anotherClassEntity.Bases.OfType<Derived>() .