ASP.NET Web API 2 CRUD Работа с Entity Framework - PullRequest
0 голосов
/ 06 июня 2018

Я создаю проект MS Web API 2.Я создал свою Entity Framework в отдельном проекте и ссылаюсь на него в своем API.Читая несколько учебных пособий, предлагается следующее:

"в идеале мы не должны возвращать объекты сущностей EF из Web API. Рекомендуется возвращать DTO (Data Transfer Object) из Web API".

Следовательно, я создал свою модель в своем API:

namespace MyAPI.Models
{
  [Table("Customer")]
  public class CustomerViewModel
  {
    [Key]
    public int CustomerID { get; set; }
    public string Code { get; set; }
    public string Name { get; set; }
  }
}

Мой вопрос: Нужно ли создавать класс контекста данных для каждой модели вмой API или это нормально использовать класс контекста EF? И если мне нужно создать отдельный контекст для каждой модели, как я могу добиться этого с помощью ссылки на класс контекста EF? Нижеэто то, с чего я начал:

namespace MyAPI.Models
{
   public class CustomerDbContext : DbContext
   {
       public CustomerDbContext() : base("name=CusetomerDbContext")
       {
       }

       public DbSet<MyEFDataAccess.Customer> CustomerViewModel { get; set; }
   }
}

А мой контроллер:

namespace MyAPI.Controllers
{
   public class CustomersController : ApiController
   {
    private readonly CustomerDbContext _context = new CustomerDbContext();

    // GET: api/Customer
    public IQueryable<CustomerViewModel> GetCustomerViewModels()
    {
        return _context.CustomerViewModel;
    }
}

Вышеприведенное правильно выдает ошибку, поскольку не может напрямую преобразовать клиента EF в CustomerViewModel!

1 Ответ

0 голосов
/ 06 июня 2018

в идеале мы не должны возвращать объекты сущности EF из Web API.Рекомендуется возвращать DTO (объект передачи данных) из веб-API.

Причина этого заключается в том, чтобы убедиться, что вы можете изменить схему БД без изменения API, и наоборот.Если вы достигаете этой цели, то вы придерживаетесь данного совета.

Проблема, с которой вы столкнулись, является базовой.Тип A не может быть неявно преобразован в тип B.Что касается компилятора, вы пытаетесь преобразовать DbContext в FormControl, и он не знает, как это сделать.Вы должны четко сказать, что делать.Один пример, хотя и не велик:

public DbSet<MyEFDataAccess.Customer> Customer { get; set; }

и

public IQueryable<CustomerViewModel> GetCustomerViewModels()
{
    return _context.Customer.Select(
        customer => new CustomerViewModel
        {
            // <assign properties here>
        }
    );
}

При этом возвращение IQueryable<T> от вашего Контроллера - это определенное нет-нет.Вы определенно хотите разрешить потребителю запрашивать определенные записи.Вы можете сделать это, чтобы включить нумерацию страниц, например:

public async Task<List<CustomerViewModel>> GetCustomerViewModels(
    int skip = 0,
    int take = 100
)
{
    return await _context.Customer
        .Skip(skip)
        .Take(take)
        .Select(
            customer => new CustomerViewModel
            {
                // <assign properties here>
            }
        )
        .ToListAsync();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...