我使用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类?
答案 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/)