Entity Framework中使用派生类作模型能否生成含基类属性的表
可行性结论
这种跨程序集继承无EF依赖的普通类、将派生类作为EF模型的做法完全可行,不需要给原独立项目引入任何EF相关包,是分层架构下复用数据模型定义的常用手段。
默认配置下,EF会自动识别基类中符合映射规则的属性,将其和派生类自有属性合并生成同一张数据表,不会单独为基类创建表。
示例代码的映射问题
你提供的示例代码存在一处会导致基类属性无法映射的细节问题:
独立项目中
User类的Username、Password属性未显式声明访问修饰符,C#类成员的默认访问级别为private,EF无法探测到非公共的实例属性,因此这两个字段不会被纳入生成的表结构。你只需要给这两个属性加上public访问修饰符即可正常映射,EF Core 3.0及以上版本原生支持init属性访问器,不需要额外改成可写的set访问器。
修正后的基类代码:
public class User : IUser { public string Username { get; init; } public string Password { get; init; } }
默认生成的表结构
修正属性访问级别后,将UserDB注册到DbContext的实体集合中,EF默认使用TPH(单表继承)映射策略,生成的UserDB表会包含3个字段:
Id:int类型,默认被EF识别为实体主键Username:string类型,继承自基类UserPassword:string类型,继承自基类User
如果你手动配置了TPT(每个类型一张表)等特殊继承映射策略,EF才会拆分出基类独立表、通过外键关联派生类表,默认开箱即用的配置不会触发该行为。
内容的提问来源于stack exchange,提问作者zvz
相关产品推荐
相关产品推荐

