【问题标题】:MVC 4 EF database first Model constructor updatesMVC 4 EF 数据库第一个模型构造函数更新
【发布时间】:2014-07-07 17:54:01
【问题描述】:

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

我之前一直在将数据验证和更新构造函数直接添加到生成的模型类中,但是我预见到这些表将被更新,我不想将这些都添加回来,而且我不应该这样做无论如何编辑这些自动生成的类。

使用来自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 first MVC 添加构造函数以不更新生成的模型类?

【问题讨论】:

  • 您可以将验证应用于您的视图模型 - 与应用于数据模型实体的概念相同。

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


【解决方案1】:

不是 100% 确定您要做什么,但我会尽力回答您的问题。

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

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

对于您的广告系列类:

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/)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多