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添加构造函数,以不更新生成的模型类?
我不能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/)