c# - 如何将子类属性映射到每个层次结构的表中的列?

标签 c# .net entity-framework

注意:我认为这在技术上仍然是代码优先,但我也有一个现有的数据库,所以我不会即时生成模型或数据库(没有 .edmx)。

我有一个 TPH 情况,其中子类具有特定于它们的字段。我为基类定义了一个 EntityTypeConfiguration如何将特定于子类的字段映射到我的数据库表中的列?

public class Letter
{
    public string Name { get; set; }
}

public class A : Letter
{
    public int quantity { get; set; }
}

public class B : Letter
{
    public ComplexType description { get; set; }
}



public class LetterMap : EntityTypeConfiguration<Letter>
{
    HasKey...
}

这是 EF 4.1。

编辑:

我已经实现了 Eranga 建议的解决方案 below .我现在的问题是两个子类将不同的值映射到同一列。 (第三个子类根本不填充该列,这就是为什么我可以将该属性上移一个级别)。

(590,6) : error 0019: Each property name in a type must be unique. Property name 'Description_Title' was already defined.

例如:

B.description.title 映射到“Description_Title”列

同时

C.description.shortTitle 映射到同一列

最佳答案

使 Letter 类抽象

public abstract class Letter
{
    public string Name { get; set; }
}

public class LetterMap : EntityTypeConfiguration<Letter>
{
    public LetterMap()
    {
        HasKey(l => l.Id);

        //assuming discriminator column is "Type"
        Map<A>(a => a.Requires("Type").HasValue<byte>(1));
        Map<B>(b => b.Requires("Type").HasValue<byte>(2));
    }
}

public class BMap : EntityTypeConfiguration<B>
{
    public LetterMap()
    {
          HasOptional(b => b.description)
            WithMany()
            HasForeignKey(b=> b.descriptionId);
    }
}

关于c# - 如何将子类属性映射到每个层次结构的表中的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7231173/

相关文章:

c# - 以编程方式生成颜色图表?

c# - 实现拦截器模式时出现问题

c# - sleep /等待很长时间

c# - 根据什么优先规则,a[x].SomeMember 被评估为 (a[x]).SomeMember 而不是……?

c# - 使用 Linq to Entities 的装箱值

LINQ 查询 : Dynamically add Includes at run time

C# 浏览器缩放

c# - .NET 4 是否支持任何 6-Sigma 计算?

c# - 释放文件锁时收到通知

c# - 使用 LINQ 创建 JSON