C# 在使用实体框架的同时重构代码

C# 在使用实体框架的同时重构代码,c#,entity-framework,C#,Entity Framework,我有一个小应用程序,它使用EF来持久化我的数据 目前,我有一个直接映射到“Ticket”表的“Ticket”类 但是,现在需要创建不同类型的票(例如,邮轮票、机票、火车票),所以我想重构我的代码,使这三种票类型都继承自一个基本票类 是否可以在维护/修改现有数据库的同时执行这种重构 我的直觉是,如果不从头开始重新创建数据库,然后从现有数据库复制数据,几乎不可能做到这一点。您必须使用TableAttribute。对于这种情况,EF将创建两个一对一相关的表 [Table("Ticket")] clas

我有一个小应用程序,它使用EF来持久化我的数据

目前,我有一个直接映射到“Ticket”表的“Ticket”类

但是,现在需要创建不同类型的票(例如,邮轮票、机票、火车票),所以我想重构我的代码,使这三种票类型都继承自一个基本票类

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


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

您必须使用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 

是的,在维护/修改现有数据库的同时执行这种重构是可能的

如果您以正常方式添加迁移,那么entity framework将向
票证
表中添加一个“鉴别器”列。您可能需要使用正确的值填充现有数据,但默认情况下该值为空,因此数据库更新不会失败

您可以将
DbSet
s添加到
cruisecket
AirlineTicket
TrainTicket
的上下文中,这些将仅返回该类型的实体。或者您可以使用
票证
DbSet
检索票证,如下所示:

context.Tickets.OfType().FirstOrDefault(n=>n.Id==Id)

这是实现继承的默认设置。你可能更喜欢,甚至更喜欢

参考资料:


我知道代码优先迁移,并在向类中添加新属性时使用了它。我想知道代码优先迁移是否仍然支持这种主要的重分解。我已经在新类和新数据库集上使用了代码优先迁移。你试过了吗?如果是的话,你有什么问题吗?第一个问题是你是否应该使用子类。继承可能是一种巨大的杀伤力,特别是与ORM结合使用时。通常,只需添加一个
类型
字段就足够了。在代码中,您可以通过继承以外的其他模式对行为差异进行编程。不正确,table属性用于在每个类型的表中实现继承。EF有3种实现继承的策略Yes sure。您可以通过选择表名(不同或相同)来选择策略。但我更喜欢TablePerType策略。您不必选择表名。默认情况下,EF使用TPH。TPH在性能和简单性方面取得了胜利,而模式演化是简单的。您可能更喜欢TPT,因为模式是标准化的,但OP并不是在这里要求一个策略,只是是否有可能阅读我随您的建议浏览的博客和TPT策略,因为我更喜欢为每种票证类型创建一个表。