桂林北站附近住宿,网站分站程序,红酒网站建设,码制作二维码官网原文地址#xff1a;https://www.cnblogs.com/lwqlun/p/10576443.html作者#xff1a;Lamond Lu 源代码#xff1a;https://github.com/lamondlu/EFCoreFindSample背景介绍当我们在工作单元(UnitOfWork)中使用EF/EF Core的时候#xff0c;为了要保持事务#xff0c;一个用… 原文地址https://www.cnblogs.com/lwqlun/p/10576443.html作者Lamond Lu 源代码https://github.com/lamondlu/EFCoreFindSample背景介绍当我们在工作单元(UnitOfWork)中使用EF/EF Core的时候为了要保持事务一个用户操作只能调用一次SaveChange方法但是有时候一个用户操作需要调用多个Repository并且他们操作的实体是关联的。这时候在一个Repository中获取另外一个Repository中添加/修改/删除的实体就变成了一个问题。问题说明当前我们做一个学生管理系统学生和班之间是多对多关系一个学生可以属于多个班 因此我们创建了如下的EF上下文。在用户界面上我们允许用户在添加学生的时候同时将学生分配到一个班级中。因此我们的控制器代码如下为了完成我们的业务在StudentManager的AddStudent方法中我们需要完成两步操作•添加学生信息•将学生分配给指定班这里我们使用StudentRepository的AddStudent方法来完成保存学生信息使用GroupRepository的AssignStudentToGroup方法来将学生分配给班级。这里其实不应该将保存学生信息和分配班级都放在这里可以使用事件发布/订阅[3]将其分配班级的逻辑移动到别处。针对保存学生信息的操作代码很简单。但是当我们继续编写AssignStudentToGroup方法时就会遇到问题我们该如何获取到前面方法中添加的Student实体这时候有同学会去尝试_dbContext.Students.Where(pp.StudentId studentId)你会发现它获取不到你想要的对象原因是这条语句进行的是数据库查询当前新增的Student对象还没有保存到数据库那么如何解决这个问题呢这里有2种解决方案•从ChangeTracker上获取•使用Find方法获取从ChangeTracker上获取ChangeTracker是EF/EF Core中的核心对象在这个对象中记录了当前EF上下文操作过的所有实体实体状态及实体属性的变更。ChangeTracker中的Entries泛型方法可以帮助我们获取到当前上下文中操作过的指定类型实体集合。但是这样写会出现一个问题如果我想为一个数据库中已经存在的学生分配班级调用这个方法就会出现问题因为该实体还未加载到ChangeTracker中, 所以我们这里还需要使用_dbContext.Students.First方法进行数据库查询.至此整个方法的修改就完成了。如果你觉着这种方式比较繁琐请继续看下面的Find方法。使用Find方法EF/EF Core中其实还提供了一个Find方法以下是该方法的方法签名。从这个Find方法的注释中我们可以了解到Find方法可以根据实体主键查询实体。但是它的优点是它会优先去ChangeTracker中查找如果查找不到才会生成查询语句进行数据库查询。由此我们可以使用Find方法修改AssignStudentToGroup方法看起来比之前的代码简化了不少References[1]: https://www.cnblogs.com/lwqlun/p/10576443.html[2]: https://github.com/lamondlu/EFCoreFindSample[3] 事件发布/订阅: https://www.cnblogs.com/lwqlun/p/10468058.html