1

我们Entity Framework 6.1在我们的 MVC 应用程序中使用,使用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 和 Discriminator。Volume 列将仅用于 SubClassOne,Volume1 将用于 SubClassTwo,Number 仅用于 SubClassThree。

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

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

4

1 回答 1

1

您可以将属性 [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; }
}

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

于 2015-11-19T10:15:12.257 回答