派生的POCO引用相同的表 - 奇怪的命名问题

时间:2015-03-13 18:36:16

标签: c# entity-framework

我有一个“基础”实体,其中有一些属性被一些共享库中的其他东西(存储库模式,队列等)使用。映射到复数表。

我需要为我的具体实现添加一个属性,我想重用所有其他正常行为。

我派出了一个班级:

public interface IItem {
    [Key]
    Guid Id { get; set; }
    string Name { get; set; }
}

public class Item : IItem {
    [Key]
    public Guid Id { get; set; }
    public string Name { get; set; }
}

public interface IExtended {
    bool IsExtended { get; set; }
}

[Table("Items")]        // <-- my nemesis
public class ExtendedItem : Item, IExtended {
    [Column("_Extended")]
    public bool IsExtended { get; set; }
}

我设置了代码优先的上下文:

public class MyContext : DbContext {
    public MyContext(string connectionString) : base(connectionString) {
        // manually creating the tables, no migrations
        Database.SetInitializer<EfQueueContext>(null);
    }

    public DbSet<Item> Items { get; set; }
}
  • 没有DataAnnotation [Table]我得到异常“无效的列名'Discriminator'” - 没关系,很奇怪但是makes sense
  • 使用[NotMapped]我得到异常“实体类型ExtendedItem不是当前上下文模型的一部分” - 好的,有意义
  • 使用注释[Table("Item"]我得到异常“table'dbo.Item'不存在” - 好吧,呃忘了它复数原始
  • 使用注释[Table("Items")]我得到异常“table'dbo.Items1'不存在” - 什么??? 1后缀的来源是什么?
  • 即使创建仅指DbContext而非ExtendedItem的全新Item仍会添加'1' (更新 - 我实际上并没有创建一个干净的实例;请参阅答案评论

1 个答案:

答案 0 :(得分:0)

当您在子类上应用Table属性以指定映射的表名时,问题是您想要创建Table per Type (TPT)的EF推断。在您的情况下,您尝试重命名与ExtendedItem实体相关的表,但您使用的是根表的相同名称,这就是EF创建两个名为Items1的表的方式(因为您已经使用与Items实体相关的继承实体中的Item名称和另一个与Items实体相关的名为ExtentedItem的名称

如果要创建Table per Hierarchy (TPH)并且想要重命名根表,则需要在根实体([Table("Items")])和所有实体上应用Item数据注释继承自它。

相关问题