场景:我正在编写一个处理报告生成的程序。
我将报告存储在数据库中,映射到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模型中。
答案 0 :(得分:6)
“有一个专门映射到数据库的类是否有意义 另一个获取该信息的类,另外还有 其他计算领域?“
很可能是的。通常我会创建一个以“ViewModel”为后缀的新类,例如HumanResourcesReportViewModel,如果我的实体类是HumanResourcesReport。
关于如何使用ViewModel有很多变化,我们可能会就术语进行一场迂腐的辩论,但从概念上讲,带上你的实体并创建一个包含该数据的新类以及处理报告所需的任何其他信息。在这种情况下,报告生成的方式是MVC模型的视图,所以我认为将类数据控制为ViewModel并不是冒犯性的。
答案 1 :(得分:6)
是的,我绝对相信你应该有不同的类来建模你的域而不是数据库。除非您的应用程序非常简单,否则如果您尝试直接映射域对象,则必须更改它们以匹配您需要的数据结构,并可能暴露您不想公开的内容。将其视为违反单一责任原则;如果您将其作为域对象并直接映射,则您的类有两个原因需要更改。一个是响应不断变化的业务需求,另一个是响应不断变化的数据存储架构。
答案 2 :(得分:4)
您使用的是Code First还是DB First?
您可以在模型中使用自动计算字段,这些字段未映射到数据库中的字段。
这还取决于您的架构。如果您首先使用数据库,刷新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; }
}
}