MVC 4 EF数据库首先更新模型构造函数

本文关键字:更新 模型 构造函数 EF 数据库 MVC | 更新日期: 2023-09-27 18:04:17

我已经创建了一个MVC 4应用程序与EF db-first使用ADO。. NET实体数据模型。

我以前一直在直接将数据验证和更新构造函数添加到生成的Model类中,但是由于我预见到这些表将被更新,所以我不想将这些都添加回去,而且我不应该编辑这些自动生成的类。

使用来自http://www.asp.net/mvc/tutorials/mvc-5/database-first-development/enhancing-data-validation的Metadata.cs和PartialClasses.cs我不确定更新这些模型类的默认构造函数的最佳方法。

这是一个简化的示例模型。在.edmx

public partial class Campaign
{
    public Campaign()
    {
        this.Fees = new HashSet<Fee>();
    }
    public int ID { get; set; }
    public string Name { get; set; }
    public string CreatedBy { get; set; }
    public System.DateTime CreatedOnDate { get; set; }
    public virtual ICollection<Fee> Fees { get; set; }
}

在ParticalClasses.cs中[错误作为生成的Modal类定义了默认构造函数]

[MetadataType(typeof(CampaignMetadata))]
public partial class Campaign
{
    public Campaign()
    {
        this.Fees = new HashSet<Fee>();
        // Non-Generated 
        this.CreatedOnDate = DateTime.Now;
    }
}

我有其他模型,我也想有不同参数的其他构造函数,所以为了简化我的问题,我在哪里为DB第一MVC添加构造函数,以不更新生成的模型类?

MVC 4 EF数据库首先更新模型构造函数

我不能100%确定你在做什么,但我会尽量回答你的问题。

首先,你似乎错过了MVC的要点:你的链接是指视图模型验证器,但你正在谈论数据模型。两件完全不同的事情。在数据模型中没有什么需要验证的——这些变化是由数据库中发生的事情控制的。

我要这样做:
1)创建一个数据层:这将容纳所有的实体类。
2)创建一个服务层:这将使用原始sql或模式(例如存储库模式)实例化和填充实体类。3)创建你的网站:这将保存你的控制器,视图模型(它们是你想要验证的)和视图。

For your Campaign类:

public interface IEntity
{
   object EntityID { get; set; }
}
public abstract class BaseEntity: IEntity
{
   public abstract object EntityID { get; set; }
}
public class Campaign : BaseEntity
{
   #region Properties
   public int ID { get; set; }
   public string Name { get; set; }
   public string CreatedBy { get; set; }
   public DateTime CreatedOnDate { get; set; }
   public virtual List<Fee> Fees { get; set; }
   #endregion
   #region BaseEntity Implementation
   public override object EntityID
   {
       get { return this.ID; }
   }
   #endregion   
   #region Constructors
   public Campaign()
   {
      this.CreatedOnDate = DateTime.Now;
      this.Fees = new List<Fee>();
   }
   #endregion
}
//View model
//THIS is the class you want to validate
public class CampaignViewModel
{
   #region Properties
   public int ID { get; set; }
   [StringLength(50)]
   public string Name { get; set; }
   [Required]
   public string CreatedBy { get; set; }
   public DateTime CreatedOnDate { get; set; }
   public Fee AssociatedFee { get; set; } 
   #endregion
   #region Constructors
   public CampaignViewModel() 
   { }
   public CampaignViewModel(Campaign data)
   {
      this.ID = data.ID
      this.Name = data.Name;
      this.CreatedBy = data.CreatedBy;
      this.CreatedOn = data.CreatedOn;
      this.AssociatedFee = data.Fees.Where(x=>x.Active && x.ID == this.ID);
      //Just an example
   }
   #endregion
}

同样,您可以使用Fluent Validation对关注点进行更深入的分离。(http://fluentvalidation.codeplex.com/)

相关文章: