ASP MVC 数据库优先 - 刷新 EF 实体框架时丢失所有验证
Posted
技术标签:
【中文标题】ASP MVC 数据库优先 - 刷新 EF 实体框架时丢失所有验证【英文标题】:ASP MVC Database First - Lose all validations when refreshing EF Entity Framework 【发布时间】:2014-07-04 11:57:09 【问题描述】:我有这个烦人的问题,每次我想刷新我的实体框架架构(数据库优先)时,我都会丢失我编写的所有验证代码(带有用于翻译的资源等......),然后我需要返回从版本控制到我以前的代码,并按照刷新模式之前的方式覆盖它。我确实找到了一个补丁来解决这个问题,但我发现它的开销很大......我需要一些关于如何处理这个问题的建议......拜托!因此,假设我的带有验证和资源的模型(问题更短)如下:
public partial class tblReport
public int id get; set;
[Display(ResourceType = typeof(Resources.Admin), Name = "ReportName")]
[Required(ErrorMessageResourceType = typeof(Resources.Admin), ErrorMessageResourceName = "Required")]
public string reportName get; set;
[Display(ResourceType = typeof(Resources.Admin), Name = "CreatedDate")]
[Required(ErrorMessageResourceType = typeof(Resources.Admin), ErrorMessageResourceName = "Required")]
public DateTime dtCreated get; set;
在刷新 EF Schema 后,它将清除所有内容并将其恢复为默认值,如下所示:
public partial class tblReport
public int id get; set;
public string reportName get; set;
public DateTime dtCreated get; set;
现在我确实找到了一个补丁,正如我所说,它是扩展 tblReport
类并将所有验证放在那里,但这等于从 EF Schema 复制 1 到 1 并插入验证......所以我执行如下扩展:
public class tblReportModel : tblReport
public int id get; set;
[Display(ResourceType = typeof(Resources.Admin), Name = "ReportName")]
[Required(ErrorMessageResourceType = typeof(Resources.Admin), ErrorMessageResourceName = "Required")]
public string reportName get; set;
[Display(ResourceType = typeof(Resources.Admin), Name = "CreatedDate")]
[Required(ErrorMessageResourceType = typeof(Resources.Admin), ErrorMessageResourceName = "Required")]
public DateTime dtCreated get; set;
public tblReport ToTblReport()
tblReport tReport = new tblReport();
tReport.dtCreated = this.dtCreated;
tReport.reportName = this.reportName;
tReport.id = this.id;
return tReport;
public static tblReportModel ToTblReportModel(tblReport createdReport)
tblReportModel mReport = new tblReportModel();
mReport.dtCreated = createdReport.dtCreated;
mReport.reportName = createdReport.reportName;
mReport.id = createdReport.id;
return mReport;
我发现这是徒劳无功的工作,不仅如此,我还需要更新我的 Controller 中的所有代码,并针对 Create/Edit 页面使用新的 tblReportModel
,以便他们完成验证。我确实以这种方式工作,但开销太大......哦,这样做,我也会收到一堆警告说
'IntranetApplication.Models.tblReportModel.dtCreated' hides inherited member 'IntranetApplication.Models.tblReport.dtCreated'. Use the new keyword if hiding was intended.
请!!!有没有比这更好的解决方案???
【问题讨论】:
你是先使用Data-Base吗?如果是,您必须使用 MetaData 扩展您的模型。 是的,它在我的问题的标题中...... Database First.. 我不知道 MetaData,因为我还在 ASP MVC 的学习曲线上,你能给出答案吗?跨度> Data Annotations with Entity Framework 5.0 (database first)的可能重复 确实它看起来像一个答案,但由于我仍在学习曲线上,我发现它缺少一些信息......我应该如何在控制器中调用我的代码?代码更改是否只发生在这个新的部分类中?如前所述,我完成了部分课程,但我不知道下一步该做什么。 您使用的是哪个版本的实体框架?你有 .edmx 文件吗? 【参考方案1】:使用 MetadataType 或扩展自动生成的类都是痛苦的方法 - 阅读 Fals 发布的问题,您就会明白我的意思。
我所做的是将所有数据访问层代码放在一个单独的项目中。然后我用我的业务对象创建另一个项目(我将验证添加到这些项目中)并使用AutoMapper 在 DAL 和业务对象之间映射对象。
这种方法提供了更好的关注点分离,并且可以在您需要/想要时轻松切换到功能中的另一个 ORM。这将是在 AutoMapper 中重新映射对象的问题。
【讨论】:
谢谢,我确实阅读了另一个答案的 Fals 链接,但我发现它并不完整,因为我仍在学习 ASP MVC ......在你这边,你能提供例子吗?即使它与您的代码有关,这也会有所帮助..感谢您的时间。 @ghiscoding - 我不明白它的不完整之处,或者令人困惑的地方。您只需创建第二个部分类,其名称与自动生成的部分类相同,向其中添加 MetadataType 属性,然后创建一个包含与您的属性相同的属性的元数据类。是的,这是很多额外的工作,这也是您不应该将数据模型直接传递给视图的原因之一,因为您的数据模型与视图的要求不同。 @ErikFunkenbusch 因为我来自 php 世界,我什至不知道什么是 Partial Class,我从不使用它。话虽如此,我不清楚我将在控制器中使用什么以及如何使用它,我是否将其用作答案中未提及的tblReport
或tblReportPartial
。对我来说,ASP MVC 有很大不同,尤其是 OOP 与 PHP OOP 相比,这让我感到困惑......
@ghiscoding 部分类允许您将一个类拆分为两个单独的定义。在编译时,定义被合并到一个类中。它们必须命名相同,所以不......它不会有部分名称。这里的要点是您允许生成器重新生成一个部分,但您的带有元数据的另一部分不会重新生成。在编译时,这两个定义被合并到一个类中。见hartzer.wordpress.com/2010/01/26/mvc-buddy-class
@ghiscoding 我今晚回家后会发布一些示例代码。坚持住... ;) 请记住,我的建议不会让您编写更少的代码;这只是一种我认为很好的技术,因为它可以更好地分离关注点和项目组织。以上是关于ASP MVC 数据库优先 - 刷新 EF 实体框架时丢失所有验证的主要内容,如果未能解决你的问题,请参考以下文章
我们如何使用 EF 在 ASP.Net MVC 应用程序中创建 3 层架构?
如何使用 MVC3 ASP.NET 4.5 和 EF6 基于实体属性注释对 TextBoxFor 进行舍入