在使用实体框架时重构代码

本文关键字:重构 代码 框架 实体 | 更新日期: 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, AirlineTicketTrainTicket的上下文中,这些将只返回该类型的实体。或者,您可以使用Tickets DbSet来检索票证,如下所示:

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

这是实现继承的默认表每层次策略。您可能更喜欢按类型表或甚至按具体类型表

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

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