任何指示实体框架在代码优先、按层次结构的表方法中从列映射到模型属性的方法

本文关键字:方法 映射 属性 模型 层次结构 框架 实体 指示 代码 任何 | 更新日期: 2023-09-27 18:22:27

我们在MVC应用程序中使用Entity Framework 6.1,使用code-firsttable-per-hierarchy方法,因为我们是从头开始开发的,我们认为这种方式适合快速开发。但现在我有个问题:假设我有一个基类和三个子类,看起来像这样:

public class BaseClass
{
    public int ID { get; set; }
    public string Name { get; set; }
}
public class SubClassOne : BaseClass
{
    public double Volume { get; set; }        
}
public class SubClassTwo : BaseClass
{
    public double Volume { get; set; }
}
public class SubClassThree : BaseClass
{
    public int Number { get; set; }
}

使用默认设置时,EF将为数据库表创建6列:ID、Name、Volume、Volume1、Number和Discriminater。Volume列将仅用于SubClassOne,Volume1将用于SubClassTwo,Number仅用于SubClassThree。

我不太关心数据库行空间的"浪费"。但有一件事困扰着我:如果我是一个新的开发人员,现在直接查看数据库,"Volume"answers"Volume1"的名称会让我感到困惑。我知道在代码方面有SubClassOne和SubClassTwo,它们都有一个名为"Volume"的属性。但我永远不知道哪一列是为哪一类准备的。所以我的问题是,有没有任何方法可以指示实体框架(例如,使用属性)SubClassOne.VolumeSubClassTwo.Volume都映射到数据库中的Volume列。(另一个好处是我减少了一列,但这不是我的主要目标)。

我想,如果我不使用实体框架、代码优先或按层次结构设计表,并且自己设计表,尤其是DAL,我就可以完全控制并实现这一点。但是现在怎么样?

任何指示实体框架在代码优先、按层次结构的表方法中从列映射到模型属性的方法

您可以对两个class使用属性[Column("Volume1")]和[Column[("Volume2")],这样它就可以映射到相关的数据库列,并且您有相同的属性名称"Volume"。

public class BaseClass
{
    public int ID { get; set; }
    public string Name { get; set; }
}
public class SubClassOne : BaseClass
{
    [Column("Volume1")]   
    public double Volume { get; set; }        
}
public class SubClassTwo : BaseClass
{
    [Column("Volume2")] 
    public double Volume { get; set; }
}
public class SubClassThree : BaseClass
{
    public int Number { get; set; }
}

这很好用。如果有任何疑问,请告诉我。