Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除需要先在存储库模式中读取吗?_C#_Entity Framework_Repository Pattern - Fatal编程技术网

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

C# 删除需要先在存储库模式中读取吗?,c#,entity-framework,repository-pattern,C#,Entity Framework,Repository Pattern,我看到了关于存储库模式的好资料,比如视频和Aspnet样板。我知道存储库不应该有提交数据的逻辑,这是工作单元的责任。 但在我看来,删除带有孩子的家长记录有点过重,因为你可能需要阅读家长,所有的孩子,然后删除。您可以看到这样的实现示例,在同一视频中使用实体框架。Aspnet样板已经完成。 所以,我问:我可以使用delete命令并且仍然尊重模式吗?有什么好的例子吗?如果您为每个请求注入一个上下文,或者在本例中为一个工作单元注入一个上下文,我看不出这会是一个什么问题,因为在当前请求中都是相同的上下文,

我看到了关于存储库模式的好资料,比如视频和Aspnet样板。我知道存储库不应该有提交数据的逻辑,这是工作单元的责任。 但在我看来,删除带有孩子的家长记录有点过重,因为你可能需要阅读家长,所有的孩子,然后删除。您可以看到这样的实现示例,在同一视频中使用实体框架。Aspnet样板已经完成。
所以,我问:我可以使用delete命令并且仍然尊重模式吗?有什么好的例子吗?

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

var product = new Product { Id = productId };
db.Entry(product).State = System.Data.Entity.EntityState.Deleted;
db.SaveChanges();
通过这种方式,您只需少读一次,除此之外,还可以查看组件,例如,以及为什么要使用ORM。

我实际上认为:

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();
我的眩晕:

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


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

使用。我想首先要问自己的问题是,为什么要在DbContext之上实现一个存储库模式,而DbContext已经是一个存储库和工作单元了?我听到的唯一一个稍微好一点的理由是:“但是如果我们需要切换持久层怎么办?”这在我的经验中几乎从未发生过。这里有一篇关于存储库可能不是最适合EF的好文章:一些人认为使用DbContext可以满足存储库的需要。我正在研究来自Mosh的这段视频,它显示了当DbContext不是一个好的解决方案时:无论如何,我的问题仍然有相同的问题:要实现存储库,我总是需要在删除之前读取一个实体?我如何使用delete命令,所以我只会访问数据库一次?您的解决方案很好,可以避免读取子项,但仍然读取父项。我的解决方案不读取父项,而是使用已存在的父项id创建父项的实例nd在SaveChanges上删除它,就效率而言,没有其他方法,最好的做法是在不需要的时候不使用设计模式,但工作单元的目的是拥有原子事务,这是db上下文已经拥有的,顺便说一句,它是工作单元模式的实现。谢谢!很好的解决方案d有些人在这里也给出了这个例子,如果性能对您来说是一个优先考虑的问题,那么请特别关注未来的查询,但我通常不太担心这一点,因为程序员知道EF是如何工作的。
        await RepositoryContext.SaveChangesAsync();
    }