我有一个小应用程序,它使用EF来保存我的数据。
目前我有一张单票'直接映射到' Ticket'表
但是,现在需要创建不同类型的Ticket(例如Cruise Ticket,Airline Ticket,Train Ticket),所以我想重构我的代码以使这3种票类都继承自基票类。
是否可以在维护/修改现有数据库的同时执行此类重构?
我的直觉是,如果不重新开始重新创建我的数据库,然后从现有数据库复制数据,几乎不可能做到这一点。
答案 0 :(得分:1)
您必须使用TableAttribute。对于这种情况,EF将创建两个与一对一相关的表
[Table("Ticket")]
class Ticket
{
[Key]
long ID{get;set;}
}
[Table("AirTicket")]
class AirTicket : Ticket
{
string SomeSpecialAirProperty{get;set;}
}
此处表格票证将是所有tikets的一般列表。
Ticket ticket = db.Ticket.Where(n=>n.ID==ticketID).FirstOrDefault();
//the value of ticket will be an object of child (Air or etc Ticket) type
答案 1 :(得分:0)
是的,可以在维护/修改现有数据库的同时执行这种重构。
如果以正常方式添加迁移,则实体框架将向您的Ticket
表添加“Discriminator”列。您可能需要使用正确的值填充现有数据,但默认情况下它是可为空的,因此数据库更新不应失败。
您可以将DbSet
添加到CruiseTicket
,AirlineTicket
和TrainTicket
的上下文中,这些只会返回该类型的实体。或者您可以使用Tickets
DbSet
来检索这样的门票:
context.Tickets.OfType<CruiseTicket>().FirstOrDefault(n => n.Id == id)
这是用于实现继承的默认Table Per Hierarchy Strategy。您可能更喜欢Table Per Type甚至Table Per Concrete Type
参考文献: