我已经看到了关于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。 所以,我问:我可以使用删除命令并仍然尊重模式吗?那里有什么好的例子吗?
答案 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。