MVC Core Привязать ViewModel к модели - PullRequest
0 голосов
/ 22 мая 2018

У нас есть транзакционная таблица Customer с несколькими таблицами поиска с внешними ключами.Мы хотим, чтобы таблица 3 соединилась и связала ViewModel с моделью и развернулась.Я слышал, что репозитории не должны иметь доступ к ViewModels.

(a) Каков надлежащий программный протокол для этого?Я пока не хочу использовать AutoMapper.Должен ли я создать объект доступа к данным или службу, и может ли кто-нибудь написать краткий пример для меня ниже?Должен ли я создать другую папку под названием Data Service в MVC?Я купил 3 книги MVC, и ни одна из них не обсуждает DTO или модели привязки <-> viewmodels.Спасибо,

Репозиторий:

void GetByCustomerTransactionId()
{
   var result = from ct in CustomerTransaction
    join pt in ProductType on pt.ProductTypeId equals ct.ProductTypeId 
    join ss in Status on s.StatusId equals ct.StatusId 
    select new all fields
}

Модели:

public class CustomerTransaction
{
    public int CustomerTransactionId{ get; set; },
    public int ProductTypeId {get; set; }, //joins to ProductTypeTable
    public int StatusID {get; set; },  //joins to StatusTypeTable
    public string DateOfPurchase{ get; set; },
    public int PurchaseAmount { get; set; },
}

public class ProductType
{
    public int ProductTypeId{ get; set; }
    public string ProductName { get; set; },
    public string ProductDescription { get; set; },
}

public class StatusType
{
    public int StatusId{ get; set; }
    public string StatusName{ get; set; },
    public string Description{ get; set; },

}

ViewModel:

public class CustomerTransactionViewModel
    {
        public int CustomerTransactionId{ get; set; },
        public string ProductName {get; set; }, //joins to ProductTypeTable
        public string ProductDescription {get; set; }, 
        public string StatusName {get; set; },  //joins to StatusTable
        public string DateOfPurchase{ get; set; },
        public int PurchaseAmount { get; set; },
    }

Ответы [ 2 ]

0 голосов
/ 22 мая 2018
 public class CustomerTransactionViewModel : IViewModel
{
    public int CustomerTransactionId{ get; set; },
    public string ProductName {get; set; }, //joins to ProductTypeTable
    public string ProductDescription {get; set; }, 
    public string StatusName {get; set; },  //joins to StatusTable
    public string DateOfPurchase{ get; set; },
    public int PurchaseAmount { get; set; },
  // Every view model should always have mapper from dbmodel to vm.
  private void MaptoEntity(Entity e)
  {
    this.CustomerTransactionId = e.ID
    .....
    // this is also a repository that mapping db to view model.
    var prod = new ProductTypeViewModel().Load(e.ProductID);
    this.ProductName = prod.ProductName;
    this.ProductDescription = prod.ProductDescription;
    // so on.......
  }

  public bool Load(int id)
  {
   // Call data from DB.
    var entity = dbcontext.Entity.Find(id);
   // Map you from DB.
    this.MaptoEntity(entity)
  }
}

Лучшей структурой является создание интерфейса IViewModel, который потребует всех реализаций.

Теперь вы можете вызывать

var customerViewModel = new CustomerTransactionViewModel();
customerViewModel .Load(1);
0 голосов
/ 22 мая 2018

Вы смотрели в AutoMapper - для сопоставления объекта базы данных для просмотра модели.Это довольно аккуратный и чистый способ.

Если вы не хотите использовать AutoMapper, вы можете рассмотреть возможность использования статического метода.

var student = new Student { FirstName = "John", LastName = "Doe" };
var mdoel = student.ToDTO();

public static StudentViewModel ToDTO(this Student student)
{
    var model = new StudentViewModel();
    model.FullName = $"{student.FirstName} {student.LastName}";
    return model;
}

Надеюсь, это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...