如何使用ef core和clean架构调用存储过程



使用asp.net ef core、clean架构、repository/service &uow模式

考虑到插入不应该在存储库类和中进行另一方面,在服务层我们不能直接调用dbContext假设我们希望在项目的某些部分使用存储过程或原始查询,

例如,我们想做下面的链接

https://www.entityframeworktutorial.net/faq/how-to-set-explicit-value-to-id-property-in-ef-core.aspx

或者调用一个由Database执行插入操作的Stored Precedure。ExcecuteSqlCommand

我们如何在不影响架构的情况下做到这一点?我们应该在哪里叫警司?

我的项目架构与本教程非常相似

Repository Pattern Done Right


编辑:更多说明:这是添加用户存储库类的方法:

public class UserRepository : IUserRepository
{
private readonly tablighkadeDbContext _dbContext;
public UserRepository(tablighkadeDbContext dbContext)
{
_dbContext = dbContext;
}
public async Task Add(User user)
{
Entities.User newUser = new Entities.User
{

Email = user.Email,
...
};
await _dbContext.AddAsync(newUser);          
}

unitOfWork类中的completeasync方法:

public async  Task<int> CompeleteAsync()
{
return await _dbContext.SaveChangesAsync();
}

最后我在核心层有服务类,我像这样保存实体:

public async Task RegisterUser(UserAddVM userAddVM)
{           

var user = await _unitOfWork.Users.GetByEmail(userAddVM.Email);
if (user != null)
{
//...
}             
else {
var u = new User
{
Email = userAddVM.Email,
//...               
};
await _unitOfWork.Users.Add(u);
await _unitOfWork.CompeleteAsync();              
}

}

但是我不知道如何使用存储过程,

考虑到我们不应该在存储库类中保存/更新实体,基于这篇文章和我读过的其他一些文章

https://programmingwithmosh.com/net/common-mistakes-with-the-repository-pattern/

你可以扩展通用的EFRepository类来拥有你自己的实现。你应该通过Interface公开这个实现。

下面是一个OrderRepository的例子:https://github.com/dotnet-architecture/eShopOnWeb/blob/master/src/Infrastructure/Data/OrderRepository.cs

在这个例子中,他们已经实现了GetByIdWithItemsAsync(int id),类似地,你可以有你自己的实现。

你可以在UserRepository中添加一个方法。如果你的插入逻辑在存储过程中,那么你不需要使用_dbContext.SaveChanges()提交。提交将在存储过程中发生,这将不在您的控制范围内。要刷新状态,您可以在存储过程的末尾选择插入的实体,它应该更新持久实体。

public async Task Add(User user)
{
var user = _dbContext.Users.SqlQuery("dbo.AddUser @p0 ", user.Name).Single();
}

最新更新