Можно ли создавать модели представлений из моделей, созданных из таблиц базы данных, используя подход базы данных Entity Framework? - PullRequest
0 голосов
/ 08 января 2019

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

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

, например

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

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 });

        }

или

        [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 обеспечивает?

1 Ответ

0 голосов
/ 08 января 2019

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

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

  • Модель представления: Концептуально она относится к архитектурным шаблонам 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. В реальных проектах люди рассматривают намного больше вещей, таких как Шаблон репозитория для выполнения операции CRUD, Разделение проблем принцип (не рекомендуется выполнять операции с базой данных в методах действия контроллера) , Также для отображения различных объектов мы можем использовать Automapper . Есть много других факторов, которые нужно проверить, но вы можете получить представление о ваших сомнениях.

...