好的,有大量示例使用 Code First 的依赖注入的工作单元,使用通用存储库和所有这些好东西。
有没有人有使用数据库优先(edmx 与 dbContext Generator (T4))、存储过程作为函数导入、具有依赖注入的工作单元的示例。
好的,有大量示例使用 Code First 的依赖注入的工作单元,使用通用存储库和所有这些好东西。
有没有人有使用数据库优先(edmx 与 dbContext Generator (T4))、存储过程作为函数导入、具有依赖注入的工作单元的示例。
code first 或 dbfirst 的上下文将是相同的 (DbContext)。
存储过程映射到您的存储库中,而不是调用 context.Customers 您调用 context.Database.Query("Proc_whatever")。
是否有您需要帮助的特定位置,我可能有一个代码示例,但上面的所有操作都与 di、代码优先、通用存储库等方式相同。实现 UnitOfWork 的唯一更改是确保您的存储库不调用 SaveChanges,您的 UnitOfWork 接口上有一个名为 Save() 的方法,该方法又调用保存更改。
我将在https://github.com/adamtuliper/EF5-for-Real-Web-Applications更新代码以包含一个工作单元。虽然我不喜欢这种实现,但感觉有些不对劲,因此我相信它让我更倾向于 CQRS。
所以这里的想法是:注入 IUnitOfWork IUnitOfWork 包含一个 IContext,它也被注入并映射到一个上下文。IUnitOfWork 映射到 UnitOfWork 具体实现。UnitOfWork 具体实现参考了存储库:
这部分超出了我的想法,所以请原谅任何编译错误,这是原则上显示的
public class YourContext : DbContext, IContext
{
//just a regular DbContext class except use IDbSet
public IDbSet Customers { get; set; }
}
public interface IUnitOfWork
{
ICustomerRepository CustomerRepository { get; }
IOrderRepository OrderRepository { get; }
void Save();
}
public class UnitOfWork : IUnitOfWork, IDisposable
{
private readonly IContext _context;
private ICustomerRepository _customerRepository;
private IOrderRepository _orderRepository;
private bool _disposed = false;
public UnitOfWork(IContext context)
{
_context = context;
}
public ICustomerRepository CustomerRepository
{
get
{
if (this._customerRepository == null)
{
this._customerRepository = new CustomerRepository(_context);
}
return _customerRepository;
}
}
protected virtual void Dispose(bool disposing)
{
if (!this._disposed)
{
if (disposing)
{
((IDisposable)_context).Dispose();
}
}
this._disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public class CustomerController : Controller
{
private readonly IUnitOfWork _unitOfWork;
public CustomerController(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
[AutoMap(typeof(Customer), typeof(CustomerIndexViewModel)]
public ActionResult Index()
{
return _unitOfWork.CustomersRepository.GetAll();
//or if not using AutoMapper, use the viewmodel directly:
//return _unitOfWork.CustomersRepository.GetAll().Select(c => new CustomerIndexViewModel
{
CustomerId = c.CustomerId,
Address = c.Address,
City = c.City,
State = c.State,
FirstName = c.FirstName,
LastName = c.LastName
}).ToArray(); ;
}
}
要使用 proc,请在 CustomerRepository 中执行以下操作:
public Customer GetById(int id)
{
return this.Context.Database.SqlQuery("Proc_GetCustomer @customerID", new SqlParameter("@customerID", id)).Single();
//instead of: return this.Context.Customers.Include(o => o.Orders).Single(o => o.CustomerId == id);
}