0

我已經使用ADO.NET實體數據模型創建了具有EF db-first的MVC 4應用程序。MVC 4 EF數據庫優先模型構造函數更新

我以前一直在將數據驗證和更新構造函數直接添加到生成的模型類中,但正如我預見這些表要更新的那樣,我不想將這些全部添加回去,再加上我不應該無論如何編輯這些自動生成的類。

http://www.asp.net/mvc/tutorials/mvc-5/database-first-development/enhancing-data-validation使用Metadata.cs和PartialClasses.cs我不確定更新這些Model類的默認構造函數的最佳方法。

下面是一個簡化的示例模型。 在ParticalClasses.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; } 
} 

[錯誤的產生莫代爾類定義默認構造函數]

[MetadataType(typeof(CampaignMetadata))] 
public partial class Campaign 
{ 
    public Campaign() 
    { 
     this.Fees = new HashSet<Fee>(); 

     // Non-Generated 
     this.CreatedOnDate = DateTime.Now; 
    } 
} 

我有其他型號我也想有其他構造不同的參數,所以爲了簡化我的問題,我在哪裏添加DB first MVC的構造函數,以便不更新生成的Model類?

+0

您可以將驗證應用於您viewmodels - 與應用於數據模型實體相同的概念。 – tintyethan

回答

0

不是100%確定你正在嘗試做什麼,但我會盡力回答你的問題。首先,看起來你錯過了MVC的觀點:你的鏈接引用了視圖模型驗證器,但是你正在談論數據模型。兩個非常不同的東西。在數據模型中沒有什麼可以驗證的 - 這些變化由數據庫中正在發生的事情來決定。

這就是我要做的:
1)創建一個數據層:這可以容納所有的實體類。
2)創建一個服務層:這將使用raw 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 
} 

此外,您還可以使用流利的驗證了的問題作出更爲深入的分離。 (http://fluentvalidation.codeplex.com/

相關問題