我有一个“基础”实体,其中有一些属性被一些共享库中的其他东西(存储库模式,队列等)使用。映射到复数表。
我需要为我的具体实现添加一个属性,我想重用所有其他正常行为。
我派出了一个班级:
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; }
}
[Table]
我得到异常“无效的列名'Discriminator'” - 没关系,很奇怪但是makes sense [NotMapped]
我得到异常“实体类型ExtendedItem不是当前上下文模型的一部分” - 好的,有意义 [Table("Item"]
我得到异常“table'dbo.Item'不存在” - 好吧,呃忘了它复数原始 [Table("Items")]
我得到异常“table'dbo.Items1'不存在” - 什么??? 1
后缀的来源是什么? DbContext
而非ExtendedItem
的全新Item
仍会添加'1'答案 0 :(得分:0)
当您在子类上应用Table
属性以指定映射的表名时,问题是您想要创建Table per Type (TPT)的EF推断。在您的情况下,您尝试重命名与ExtendedItem
实体相关的表,但您使用的是根表的相同名称,这就是EF创建两个名为Items1
的表的方式(因为您已经使用与Items
实体相关的继承实体中的Item
名称和另一个与Items
实体相关的名为ExtentedItem
的名称
如果要创建Table per Hierarchy (TPH)并且想要重命名根表,则需要在根实体([Table("Items")]
)和所有实体上应用Item
数据注释继承自它。