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

时间:2014-05-19 17:05:13

标签: c# asp.net-mvc-4 default-constructor ef-database-first validation

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

我以前一直在添加数据验证并直接更新构建器到生成的Model类中,但是我预计这些表会更新,我不想再将这些表添加回来,加上我不管怎么说,不应该编辑这些自动生成的类。

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

这是一个简化的示例模型。 在.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的构造函数,以便不更新生成的Model类?

1 个答案:

答案 0 :(得分:0)

不是100%肯定你想要做什么,但我会尝试回答你的问题。

首先,您似乎忽略了MVC的要点:您的链接指的是视图模型验证器,但您正在谈论数据模型。两个非常不同的东西。在数据模型中无需验证 - 这些更改并受数据库中正在进行的操作的约束。

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

对于您的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验证来更深入地分离问题。 (http://fluentvalidation.codeplex.com/