MVC - 是否有必要再创建一个db层?

时间:2015-03-07 23:57:45

标签: c# .net asp.net-mvc entity-framework

众所周知,架构应该分为视图层,数据库层等层。

每个部分应独立于其他部分,并且可以在不更改其他图层的情况下进行替换。例如,我们有一个标准的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编写所有操作?

0 个答案:

没有答案