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

时间:2017-03-07 01:28:56

标签: c# entity-framework repository-pattern

我已经看到了关于Repository Pattern的好消息来源,比如视频Repository Pattern with C# and Entity Framework, Done Right和Aspnet Boilerplate。我知道存储库不应该有提交数据的逻辑,这是工作单元的责任。 但在我看来有点超重做删除父记录与孩子,因为你可能需要阅读父,其所有孩子,然后删除。您可以在同一视频deleting authors and course中使用Entity Framework查看类似的实现示例。 Aspnet Boilerplate有a implementation to delete with a primary key, which read the entity before deleting too。 所以,我问:我可以使用删除命令并仍然尊重模式吗?那里有什么好的例子吗?

2 个答案:

答案 0 :(得分:1)

如果在每种情况下为每个请求注入一个Context,或者在这种情况下为一个工作单元注入一个上下文,我无法看到这可能是一个问题,因为它是当前请求中的相同上下文,您只需删除父项并设置为孩子们级联,如:

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

通过这种方式,您可以少阅读一下,最重要的是看看MediatR等组件,以及为什么you don't even need a repository使用ORM。

答案 1 :(得分:0)

我实际上认为:

var product = new Product { Id = productId }; // what if here you have null?? (I didn't see any checking) in the next row will be exception
if(product == null) 
    throw new ItemNotFound($"thi is custom error handler or do magic")

db.Entry(product).State = System.Data.Entity.EntityState.Deleted;
db.SaveChanges(); // better in repository layer to have async method like await 
db.SaveChangesAsync();

P.S。我的说法:

公共异步任务DeleteTemplate(int id) { var实体=等待RepositoryContext.Set()。FindAsync(id); if(entity == null)抛出新的ItemNotFoundException($“我们在db中没有它。没有要删除的内容”); RepositoryContext.Product.Remove(entity);

        await RepositoryContext.SaveChangesAsync();
    }

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