我应该为域名和EF使用单独的模型吗?

app*_*guy 7 c# entity-framework

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

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

即,与codefirst数据库交互的样本类将是

public class Report{
    public int CategoryOneSeverity {get; set;}
    public int CategoryTwoSeverity {get;set;}
    public string Title {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

创建另一个类是否有意义,例如:

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

    public int RiskRating{
        get{ return CategoryOneSeverity + CategoryTwoSeverity; }
    }
}    
Run Code Online (Sandbox Code Playgroud)

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

Aar*_*nLS 6

"难道是有意义的有一类完全映射到数据库,另一个类,它的信息,并还具有其他计算领域?"

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

关于如何使用ViewModel有很多变化,我们可以就术语进行一场迂腐的辩论,但从概念上讲,拿出你的实体并创建一个包含该数据的新类以及处理报告所需的任何其他信息.在这种情况下,报告生成的方式是MVC模型的视图,因此我认为将类数据控制为ViewModel并不令人反感.


And*_*ndy 6

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

  • “如果您将其设为域对象并直接映射它,则您的类有两个原因需要更改。一是为了响应不断变化的业务需求,另一个是为了响应不断变化的数据存储架构。” - 这帮助我完美地想象它。谢谢! (2认同)