在使用实体框架时重构代码
本文关键字:重构 代码 框架 实体 | 更新日期: 2023-09-27 18:02:01
我有一个小应用程序,它使用EF来持久化我的数据。
目前我有一个'Ticket'类,它直接映射到'Ticket'表。
然而,现在需要创建不同类型的票(例如Cruise Ticket, Airline Ticket, Train Ticket),所以我想重构我的代码,让这3种票类型都继承自一个基票类。
是否有可能在维护/修改现有数据库的同时执行这种重构?
我的直觉是,如果不从头开始重新创建数据库,然后从现有数据库复制数据,几乎不可能做到这一点。
必须使用TableAttribute。在这种情况下,EF将创建两个相互关联的表
[Table("Ticket")]
class Ticket
{
[Key]
long ID{get;set;}
}
[Table("AirTicket")]
class AirTicket : Ticket
{
string SomeSpecialAirProperty{get;set;}
}
这里的票务表将是所有票务的总表。
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
是的,在维护/修改现有数据库的同时执行这种重构是可能的。
如果您以正常方式添加迁移,则实体框架将向您的Ticket
表添加"Discriminator"列。您可能需要使用正确的值填充现有数据,但默认情况下它是可空的,因此数据库更新应该不会失败。
您可以将DbSet
s添加到CruiseTicket
, AirlineTicket
和TrainTicket
的上下文中,这些将只返回该类型的实体。或者,您可以使用Tickets
DbSet
来检索票证,如下所示:
context.Tickets.OfType<CruiseTicket>().FirstOrDefault(n => n.Id == id)
这是实现继承的默认表每层次策略。您可能更喜欢按类型表或甚至按具体类型表
引用:https://stackoverflow.com/a/23426802/150342
https://stackoverflow.com/a/23423820/150342