ASP MVC数据库优先-刷新EF实体框架时丢失所有验证

本文关键字:框架 验证 实体 EF 数据库 MVC 刷新 ASP | 更新日期: 2023-09-27 18:03:49

我有这个恼人的问题,每次我想刷新我的实体框架模式(数据库优先),我失去了我写的所有验证代码(与资源翻译等…),然后我需要从版本控制回到我以前的代码,并覆盖它之前的方式刷新模式。我确实找到了一个补丁来解决这个问题,但我发现这是相当一些开销....我需要一些关于如何处理的建议…拜托!!因此,假设我的模型具有验证和资源(为问题缩短)如下:

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;
    }
}

我发现这是这么多的工作没有,不仅如此,我需要更新我所有的代码在我的控制器和去反对新的tblReportModel创建/编辑页面,使他们得到验证完成。我确实是这样工作的,但是开销太大了……哦,这样做的话,我还会得到一堆警告,说

'IntranetApplication.Models.tblReportModel.dtCreated' hides inherited member 'IntranetApplication.Models.tblReport.dtCreated'. Use the new keyword if hiding was intended.

请! !有人有比这更好的解决方案吗?

ASP MVC数据库优先-刷新EF实体框架时丢失所有验证

使用MetadataType或扩展自动生成的类都是痛苦的方法-阅读Fals发布的问题,你会明白我的意思。

我所做的是,我有我所有的数据访问层代码在一个单独的项目。然后,我用我的业务对象创建另一个项目(我将验证添加到这些项目中),并使用AutoMapper在DAL和业务对象之间映射对象。

这种方法提供了更好的关注点分离,并且如果您需要/想要切换到特性中的另一个ORM很容易。这将是一个在AutoMapper中重新映射对象的问题。