![](/img/trans.png)
[英]What is preferable Entity Framework or Repository with Asp.Net Web Api
[英]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.