8

场景:我正在编写一个处理报告生成的程序。

我将报告存储在数据库中,映射到 EF 模型。有一些非数据库字段(即一些字段是根据数据库中的其他字段自动计算的)。有一个类只映射到数据库,另一个类获取该信息并另外具有其他计算字段是否有意义?

即与 codefirst 数据库交互的示例类将是

public class Report{
    public int CategoryOneSeverity {get; set;}
    public int CategoryTwoSeverity {get;set;}
    public string Title {get;set;}
}

制作另一个课程是否有意义,例如:

public class ReportModel{
    public int CategoryOneSeverity;
    public int CategoryTwoSeverity;
    public string Title;

    public int RiskRating{
        get{ return CategoryOneSeverity + CategoryTwoSeverity; }
    }
}    

或者 RiskRating 属性应该在 EF 模型中。

4

3 回答 3

8

是的,我绝对相信你应该有不同的类来为你的域建模而不是你的数据库。除非您的应用程序非常简单,否则如果您尝试直接映射域对象,您总是必须更改它们以匹配您需要的数据结构,并且可能会公开您不想公开的内容。将其视为违反单一职责原则;如果您将其作为域对象并直接映射它,那么您的类有两个改变的理由。一种是响应不断变化的业务需求,另一种是响应不断变化的数据存储模式。

于 2013-05-17T16:57:52.530 回答
7

“有一个类只映射到数据库,另一个类获取该信息并另外具有其他计算字段,这有意义吗?”

很可能是的。如果我的实体类是 HumanResourcesReport,通常我会创建一个后缀为“ViewModel”的新类,例如 HumanResourcesReportViewModel。

关于如何使用 ViewModel 有很多变化,我们可能会陷入关于术语的迂腐辩论,但从概念上讲,使用您的实体并使用该数据以及处理报告所需的任何其他信息创建一个新类。在这种情况下,报告生成在某种程度上是 MVC 模型的视图,所以我认为将保存数据的类称为 ViewModel 并不令人反感。

于 2013-05-17T16:47:24.633 回答
4

您使用的是 Code First 还是 DB First?

您可以在模型中拥有自动计算的字段,这些字段不会映射到数据库中的字段。

它还取决于您的架构。如果您首先使用 DB,刷新您的 EF 模型会更新您的 EF 类,从而丢失您的映射字段。在 DB-First 场景中,另一种方法是使用 EF 模型类作为您的基类并从它继承以用于您的报表类。

public class ReportModel
{
    public int CategoryOneSeverity;
    public int CategoryTwoSeverity;
    public string Title;
}   

public class ReportClass : ReportModel
{
    public int RiskRating
    { 
        get { return CategoryOneSeverity + CategoryTwoSeverity; }
    }
}
于 2013-05-17T16:54:13.623 回答