Можно ли создавать модели представлений из моделей, созданных из таблиц базы данных, с использованием первого подхода к базе данных инфраструктуры сущностей?

С тех пор, как я начал использовать подход DATABASE FIRST к структуре сущностей. Это легко понять и интересно, но есть одна вещь, которая меня озадачивает.

В MVC мы обычно создаем модели представлений (модели со свойствами плюс-минус, чтобы они соответствовали конкретному представлению). Хорошо, но при использовании EF с первым подходом к БД это кажется невозможным. Потому что мы создаем одну модель из таблицы базы данных, а затем продолжаем использовать ее для вставки, обновления, выбора или чего-то еще.

e.g.

Модель услуг:

namespace ZahidCarWash.Models.EF
{
    using System;
    using System.Collections.Generic;

    public partial class Services
    {
        public short ServiceID { get; set; }
        public string ServiceName { get; set; }
        public Nullable<decimal> ServicePrice { get; set; }
        public Nullable<System.DateTime> EntryDateTime { get; set; }
        public Nullable<bool> IsOwner { get; set; }
        public Nullable<decimal> Commission { get; set; }
    }
}

а затем использовать его в контроллерах.

        [HttpPost]
        public JsonResult UpdateServices(Services UpdateServicesVM)
        {

            ServicesRepository ServicesRep = new ServicesRepository();

            int i = 0;

            //i = ServicesRep.UpdateServices(UpdateServicesVM, out ReturnStatus, out ReturnMessage);

            ZahidCarWashDBEntities zjdb = new ZahidCarWashDBEntities();
            zjdb.Entry(UpdateServicesVM).State = EntityState.Modified;
            i= zjdb.SaveChanges();

            return Json(new { ReturnMessageJSON = i > 0 ? "Success" : "Error", ReturnStatusJSON = i > 0 ? true : false });

        }

Or

        [HttpPost]
        public JsonResult AddServices(Services AddServicesVM)
        {

            ServicesRepository ServicesRep = new ServicesRepository();

            int i = 0;

            //i = ServicesRep.InsertServices(AddServicesVM, out ReturnStatus, out ReturnMessage);
            ZahidCarWashDBEntities context = new ZahidCarWashDBEntities();

            context.Services.Add(AddServicesVM);

            context.SaveChanges();

            return Json(new { ReturnMessageJSON = ReturnMessage, ReturnStatusJSON = ReturnStatus });

        }

Я создал другие настраиваемые модели, добавляя/удаляя свойства, но это звучит не очень хорошо. Любой достойный способ сделать или EF предоставляет?


person azure boy    schedule 08.01.2019    source источник
comment
Вы должны создавать ViewModels для представлений (не для/из моделей). Инструментов для этого не так много, большинство программистов их просто пишут. Инструменты генерации кода (скаффолдинг) поддерживают только прямой CRUD, это означает, что ваша модель данных определяет ваш пользовательский интерфейс. Не очень хорошо для большинства хороших сайтов.   -  person bommelding    schedule 08.01.2019
comment
правильно, но предположим, что представление передает модель представления A, но контроллер работает с моделью B (сгенерированной инфраструктурой сущностей), поэтому параметр должен быть типа A, и это проблема   -  person azure boy    schedule 08.01.2019
comment
Контроллер может работать с 0 или более моделями. Его работа заключается в преобразовании запросов в ViewModels и результатов в Updates.   -  person bommelding    schedule 08.01.2019
comment
не понял? ?   -  person azure boy    schedule 08.01.2019
comment
Обновление/вставка модели B (и, возможно, модели C) из ViewModel A — это обычный рабочий процесс для MVC.   -  person bommelding    schedule 08.01.2019
comment
поэтому для этого мне пришлось бы наследовать модель B от A, иначе она не узнает о ее свойствах.   -  person azure boy    schedule 08.01.2019
comment
Нет, абсолютно нет.   -  person bommelding    schedule 08.01.2019
comment
можете ли вы написать пример, просто изменив мой код, чтобы я лучше понял, что вы хотите сказать на самом деле.   -  person azure boy    schedule 08.01.2019
comment
также в поле ответов, чтобы я мог принять в качестве ответа.   -  person azure boy    schedule 08.01.2019


Ответы (1)


Здесь вы смешиваете две вещи: объекты базы данных (модель данных объекта) и модели просмотра, которые представляют собой две разные концепции.

  • Модель данных. Это простой класс, связанный с указанной таблицей из базы данных, который можно использовать в коде в качестве модели данных.

  • Модель представления. Концептуально она связана с архитектурными шаблонами MV* и используется для передачи данных в/из представления. Держите его связанным с логикой пользовательского интерфейса.

Чтобы реализовать эти две концепции в приложении MVC с использованием Entity Framework, считайте таблицы базы данных объектами данных и оставьте их только для связи с базой данных. Для выполнения операций CRUD и передачи данных в представление и из него используйте модели представлений.

Пример:

Модель данных

namespace ZahidCarWash.Models.EF
{
    using System;
    using System.Collections.Generic;

    public partial class Services
    {
        public short ServiceID { get; set; }
        public string ServiceName { get; set; }
        public Nullable<decimal> ServicePrice { get; set; }
        public Nullable<System.DateTime> EntryDateTime { get; set; }
        public Nullable<bool> IsOwner { get; set; }
        public Nullable<decimal> Commission { get; set; }
    }
}

Просмотреть модель

namespace ZahidCarWash.Models
{
    using System;
    using System.Collections.Generic;

    public class ServiceViewModel
    {
        public short ServiceID { get; set; }
        public string ServiceName { get; set; }
        public decimal ServicePrice { get; set; }
        public System.DateTime EntryDateTime { get; set; }
        public bool IsOwner { get; set; }
        public decimal Commission { get; set; }
    }
}

Контроллер

[HttpPost]
public JsonResult AddServices(ServiceViewModel model)
{
    if(model == null)
       return null;

    var addService = new Services(); 
    //Use Automapper for mapping view models to data entities
    addService.ServiceID = model.ServiceID ;  //Service Id should be auto incremented from database
    addService.ServiceName = model.ServiceName ;
    addService.ServicePrice = model.ServicePrice ;
    addService.EntryDateTime = model.EntryDateTime ;
    addService.IsOwner = model.IsOwner ;
    addService.Commission = model.Commission ;


    ServicesRepository servicesRep = new ServicesRepository();
    int i = 0;
    //i = ServicesRep.UpdateServices(UpdateServicesVM, out ReturnStatus, out ReturnMessage);

    //Don't write the data specific logic in controllers. Use Repository Pattern.
    ZahidCarWashDBEntities context = new ZahidCarWashDBEntities();
    context.Services.Add(addService);
    context.SaveChanges();
    return Json(new { ReturnMessageJSON = ReturnMessage, ReturnStatusJSON = ReturnStatus });  

Примечание. В приведенном выше коде я описал простой процесс работы с моделями представления и объектами данных в приложении MVC. В реальных проектах люди рассматривают гораздо больше вещей, таких как Repository Pattern для выполнения CRUD. операция, принцип разделения интересов (не рекомендуется выполнять операции с базой данных в методах действия контроллер). Также для сопоставления различных объектов мы можем использовать Automapper. Есть много других факторов, которые нужно проверить, но вы можете получить представление о своих сомнениях.

person iSahilSharma    schedule 08.01.2019