众所周知,架构应该分为视图层,数据库层等层。
每个部分应独立于其他部分,并且可以在不更改其他图层的情况下进行替换。例如,我们有一个标准的ASP.NET MVC应用程序,MS SQL作为数据库。此应用程序使用实体框架。因此,我们有一个特殊的视图类 - 视图类。
这些类管理从前端显示和获取信息。此外,我们有模型类,其中包括对实体框架生成的类(EF模型)的LINQ请求,更新,插入方法等。我们有厚控制器,我们只是从前端验证数据并从模型类调用方法。
在这个地方我有疑问......模型类是否必要?
如果我们当然不使用Entity Framework,我们需要这个层,因为我们不能直接在控制器中编写SQL请求(否则我们的控制器依赖于逻辑数据库模式),但我们使用实体框架和实体框架已经是概念模型了!
这意味着,我们应该将逻辑DB结构(DB的Schema)“转换”为我们的概念模型。在这种情况下应该以LINQ to Entity请求为例?直接在控制器内?什么是正确的方法?
一些例子:
接近View-Controller-Model-EF模型
查看课程:
public class VacancyFormViewModel
{
// swap is should be null and should be created manually if necessary
public VacancyFormViewModel()
{
Site = new ListViewModel();
Surgeon = new ListViewModel();
Reason = new ListViewModel();
}
public int? ID { get; set; }
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:MM/dd/yyyy}")]
public DateTime SurgeryDate { get; set; }
[Display(Name="Site")]
public ListViewModel Site { get; set; }
public TimePartViewModel StartTime { get; set; }
public TimePartViewModel EndTime { get; set; }
....
EF Model类(由Entity Framework生成):
public partial class Vacancy
{
public Vacancy()
{
this.Swaps = new HashSet<Swap>();
}
public int ID { get; set; }
public System.DateTime SurgeryDate { get; set; }
public System.TimeSpan StartTime { get; set; }
public System.TimeSpan EndTime { get; set; }
public System.DateTime NotifyDate { get; set; }
public int SiteID { get; set; }
.....
模型类(在Save方法中显示了将数据从模型类“复制”到EF模型类的操作:
public class Vacancy
{
public int? ID { get; set; }
public System.DateTime SurgeryDate { get; set; }
public int StartTime { get; set; }
public int EndTime { get; set; }
.....
public void Save()
{
VTS.EFModels.Vacancy ef_vacancy;
if (!ID.HasValue)
ef_vacancy = new EFModels.Vacancy();
else
ef_vacancy = (from i in _db.Vacancies where i.ID == ID.Value select i).FirstOrDefault();
ef_vacancy.DecisionID = DecisionEnum;
ef_vacancy.EndTime = new TimeSpan(EndTime, 0, 0);
ef_vacancy.Notes = Notes;
ef_vacancy.NotifyDate = NotifyDate;
ef_vacancy.ReasonID = ReasonID;
ef_vacancy.SiteID = SiteID;
ef_vacancy.StartTime = new TimeSpan(StartTime, 0, 0);
......
和控制器(View类和Model类之间的“桥梁”)
[HttpPost]
public ActionResult VacancyForm(VacancyFormViewModel model)
{
Vacancy v = new Vacancy();
v.ID = model.ID;
v.SurgeryDate = model.SurgeryDate;
v.SurgeonID = surgeonSelected.Item2;
v.ReasonID = int.Parse(model.Reason.SelectedItem);
v.SiteID = int.Parse(model.Site.SelectedItem);
v.DecisionEnum = model.Decision;
v.NotifyDate = model.NotifyDate;
v.SurgeryDate = model.SurgeryDate;
v.StartTime = int.Parse(model.StartTime.SelectedItem);
v.EndTime = int.Parse(model.EndTime.SelectedItem);
.....
v.Save();
.....
它有效,但它不是还原剂吗?
根本可以丢弃模型类并直接在控制器中用EF编写所有操作?