任何指示实体框架在代码优先、按层次结构的表方法中从列映射到模型属性的方法
本文关键字:方法 映射 属性 模型 层次结构 框架 实体 指示 代码 任何 | 更新日期: 2023-09-27 18:22:27
我们在MVC应用程序中使用Entity Framework 6.1
,使用code-first
和table-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.Volume
和SubClassTwo.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; }
}
这很好用。如果有任何疑问,请告诉我。