entity-framework-6 - 在实体框架中使用继承时是否可以重命名或配置鉴别器列?
问题描述
我有一个包含我的 POCO 类列的表的数据库
public class TypeOf
{
[Key, Column(Order = 0)]
public string Type { get; set; }
[Key, Column(Order = 1)]
public string Key { get; set; }
public string Value { get; set; }
}
此表已经包含大量数据
HsCode | HP | 4821 1000
SubCode | 423 | T21
SubCode | 022 | 5XL
ProductionLine | X1 | Line one
ProductionLine | X2 | Line two
Country | CN | China
Country | IN | India
…
我想通过创建 TypeOf 的继承系统来改进这一点
public class Country : TypeOf { }
public class ProductionLine : TypeOf { }
public class SubCode : TypeOf { }
public class HsCode : TypeOf { }
通过使用“类型”列作为鉴别器。
目前,当我开始使用继承时,数据库迁移仍然希望使用鉴别器列。
public partial class TypeOf : DbMigration
{
public override void Up()
{
AddColumn("dbo.TypeOfs", "Discriminator", c => c.String(nullable: false, maxLength: 128));
}
public override void Down()
{
DropColumn("dbo.TypeOfs", "Discriminator");
}
}
解决方案
这是可能的,虽然不是那么直观(恕我直言,对于 EF 设计人员来说,这可能看起来合乎逻辑且显而易见)。
您需要使用流畅的 API 并对所有Map
派生类型重复(如果不是,则还需要基类型)。Requires(e => e.Type).HasValue()
abstract
对于帖子中的示例模型,它应该是:
modelBuilder.Entity<TypeOf>()
.Map(m => m.Requires(e => e.Type).HasValue())
.Map<Country>(m => m.Requires(e => e.Type).HasValue())
.Map<ProductionLine>(m => m.Requires(e => e.Type).HasValue())
.Map<SubCode>(m => m.Requires(e => e.Type).HasValue())
.Map<HsCode>(m => m.Requires(e => e.Type).HasValue())
;
推荐阅读
- python - 魔杖python用GIF获取像素颜色
- javascript - 在 JS for 循环中的某个点存储“i”的值
- ruby - 如何让 `bundle console` 不会死于 Ctrl + C
- asp.net - 将编译后的项目保存在 wwwroot 文件夹内的一个公共目录中
- linux - 如何在 Spark 中编写一个独立的应用程序,以在填充了提取的推文的文本文件中找到 20 个大多数提及
- c# - 为共享基类的产品创建创建页面的正确方法是什么
- python - 如何使用匹配值对数据进行分组
- javascript - 在事件更改时跨表保持状态
- java - 如何使用 Java 中的 Selenium 在 Firefox 中使用自创扩展处理代理身份验证?
- css - 媒体查询和高度问题