使用实体框架时重构代码

时间:2014-05-06 11:22:18

标签: c# entity-framework

我有一个小应用程序,它使用EF来保存我的数据。

目前我有一张单票'直接映射到' Ticket'表

但是,现在需要创建不同类型的Ticket(例如Cruise Ticket,Airline Ticket,Train Ticket),所以我想重构我的代码以使这3种票类都继承自基票类。

是否可以在维护/修改现有数据库的同时执行此类重构?

我的直觉是,如果不重新开始重新创建我的数据库,然后从现有数据库复制数据,几乎不可能做到这一点。

2 个答案:

答案 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添加到CruiseTicketAirlineTicketTrainTicket的上下文中,这些只会返回该类型的实体。或者您可以使用Tickets DbSet来检索这样的门票:

context.Tickets.OfType<CruiseTicket>().FirstOrDefault(n => n.Id == id)

这是用于实现继承的默认Table Per Hierarchy Strategy。您可能更喜欢Table Per Type甚至Table Per Concrete Type

参考文献:

https://stackoverflow.com/a/23426802/150342

https://stackoverflow.com/a/23423820/150342