在存储库模式中删除需要先读取?

问题描述 投票:0回答:2

我看过有关存储库模式的好资料,例如视频 C# 和实体框架的存储库模式、Done Right 和 Aspnet Boilerplate。我知道存储库不应该有提交数据的逻辑,这是工作单元的责任。 但在我看来,删除带有子项的父记录有点过重,因为您可能需要读取父项及其所有子项,然后才能删除。您可以在同一视频中看到类似的实现示例,使用实体框架,删除作者和课程。 Aspnet Boilerplate 有一个使用主键删除的实现,它也在删除之前读取实体。 所以,我问:我可以使用删除命令并仍然遵循该模式吗?有没有什么好的例子?

c# entity-framework repository-pattern
2个回答
2
投票

如果您为每个请求注入一个上下文,或者在这种情况下注入一个工作单元,我看不出这可能会成为一个问题,因为它在当前请求中都是相同的上下文,您可以简单地删除父级并设置级联它的孩子,比如:

var product = new Product { Id = productId };
db.Entry(product).State = System.Data.Entity.EntityState.Deleted;
db.SaveChanges();

这样你就可以少阅读一篇文章,除此之外还可以看看像 MediatR 这样的组件,以及为什么 如果你使用 ORM,你甚至不需要存储库


0
投票

其实我想:

var product = new Product { Id = productId };
if(product == null) 
    throw new ItemNotFound($"Need custom error handler");

db.Entry(product).State = System.Data.Entity.EntityState.Deleted;
db.SaveChangesAsync();

附注我的版本:

public async Task DeleteTemplate(int id)
{
    var entity = await RepositoryContext.Set<Product>().FindAsync(id);
    if(entity == null) throw new ItemNotFoundException($"we don't have it in the db. We have nothing to remove");
    RepositoryContext.Product.Remove(entity);

    await RepositoryContext.SaveChangesAsync();
}

在实际项目中最好使用repositoryContext。

© www.soinside.com 2019 - 2024. All rights reserved.