EF 6 Code First下TPT转TPH后如何设置现有数据的Discriminator值?
在EF 6 Code First模式下设置已有数据的Discriminator列值
当你把实体类改成抽象类并添加实现类后,EF自动生成的Discriminator列不会自动填充原有数据的值,你可以通过以下两种方式处理:
方法一:直接执行SQL语句更新
直接在数据库管理工具(比如SSMS)里运行SQL,批量设置原有数据的Discriminator值。假设你的表名为As(EF默认会将类名转为复数作为表名),如果要把所有旧数据标记为First类型,执行:
UPDATE As SET Discriminator = 'First' WHERE Discriminator IS NULL
如果需要按条件区分设置不同类型,补充WHERE子句即可,比如:
-- 按ID范围设置为Second类型 UPDATE As SET Discriminator = 'Second' WHERE Discriminator IS NULL AND Id BETWEEN 100 AND 200
方法二:通过Code First迁移脚本处理
如果想把更新操作纳入EF的迁移流程,方便团队同步执行:
- 打开Visual Studio的Package Manager Console,执行命令创建空迁移:
Add-Migration SetDiscriminatorValues
- 在生成的迁移类中,修改
Up方法,添加SQL执行代码:
public partial class SetDiscriminatorValues : DbMigration { public override void Up() { // 根据实际需求修改SQL语句 Sql("UPDATE As SET Discriminator = 'First' WHERE Discriminator IS NULL"); } public override void Down() { // 可选:如果需要回滚,添加对应的SQL // Sql("UPDATE As SET Discriminator = NULL WHERE Discriminator = 'First'"); } }
- 执行迁移命令,让更新生效:
Update-Database
关键注意点
Discriminator的值必须和EF的约定一致:默认就是实现类的类名(比如First对应值First),如果用Fluent API自定义了鉴别器值,要和配置的字符串保持一致。- 操作前务必备份数据,避免误更新导致数据异常。
- 后续新增的实体数据,EF会自动填充对应的
Discriminator值,无需手动干预。
内容的提问来源于stack exchange,提问作者finife1670
相关产品推荐
相关产品推荐

