簡體   English   中英

使用實體框架的ASP.NET Web API 2 CRUD操作

[英]ASP.NET Web API 2 CRUD Operation with Entity Framework

我正在創建一個MS Web API 2項目。 我已經在一個單獨的項目中創建了我的實體框架,並在我的API中引用了它。 閱讀一些教程,建議:

“理想情況下,我們不應該從Web API返回EF實體對象。建議從Web API返回DTO(數據傳輸對象)”。

因此,我在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!

理想情況下,我們不應從Web API返回EF實體對象。 建議從Web API返回DTO(數據傳輸對象)。

這樣做的原因是確保您可以在不更改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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM