当前位置: 首页 > 编程语言 > C#

如何使用GenericRepository模式的连接-实体框架分享

时间:2023-04-10 19:51:44 C#

如何使用GenericRepository模式的连接-实体框架我有一个像下面这样的GenericRepository来处理我的CRUD,一个简单易用当我尝试加入我的POCO时。假设我有这些POCO,它们使用流畅的api进行映射(多对多和一对多关系):}publicintStudentId{得到;放;}publicstringStudentName{get;放;}//FKspublicvirtualStandardStandard{get;放;}publicintStdandardRefId{得到;放;}公共虚拟ICollection课程{get;放;}}publicclassCourse{publicCourse(){this.Students=newHashSet();}publicintCourseId{得到;放;}publicstringCourseName{get;放;}publicvirtualICollectionStudents{get;放;}}publicclassStandard{publicStandard()}publicintStandardId{get;放;}公共字符串描述{得到;放;}publicvirtualICollectionStudents{get;放;}}Drawing:protectedoverridevoidOnModelCreating(DbModelBuildermodelBuilder){//多对多modelBuilder.Entity().HasMany(s=>s.Courses).WithMany(c=>c.Students).Map(cs=>{cs.MapLeftKey("StudentRefId");cs.MapRightKey("CourseRefId");cs.ToTable("学生课程");});//一对多modelBuilder.Entity().HasRequired(s=>s.Standard).WithMany(s=>s.Students).HasForeignKey(s=>s.StandardId);}使用存储库:publicclassRepository:IRepositorywhereT:class,IDisposable{internalMyDbContextcontext;内部DbSetdbSet;publicRepository(){context=newMyDbContext();this.dbSet=context.Set();}publicboolAdd(Tentity){varquery=dbSet.Add(entity);如果(查询!=null)返回真;返回假;}publicboolUpdate(Tentity){dbSet.Attach(entity);varquery=context.Entry(entity).State=EntityState.Modified;如果(查询==EntityState.Modified)返回真;返回假;}publicboolDelete(Tentity){varquery=dbSet.Remove(entity);如果(查询!=null)返回真;返回假;}publicboolDelete(Guidid){varquery=dbSet.Remove(dbSet.Find(id));如果(查询!=null)返回真;返回假;}publicTGetById(Guidid){var查询=dbSet.Find(id);如果(查询!=null)返回查询;否则返回空;}publicICollectionGetAll(){返回dbSet.AsEnumerable().ToList();}publicvoidSave(){context.SaveChanges();}publicvoidDispose(){if(context!=null){context.Dispose();上下文=空;现在,如果我想将标准加入多对多表,我该怎么做呢?因此,根据您的编辑,我假设您想加入学生和标准。您需要做的第一件事是更改存储库,使其不会实例化上下文。您应该将它作为参数传递并存储对它的引用:publicRepository(MyDbContextmyCtx){context=myCtx;this.dbSet=context.Set();您必须做的第二件事是更改存储库以更改GetAll()方法以返回IQueryable而不是ICollection。然后改变GetAll()的实现:returndbSet;这样您只能获得查询而不是所有实体的评估列表。然后,您可以使用存储库的GetAll()方法进行连接,就像使用数据库集一样:varstandardRep=newRepository(ctx);varstudentToStandard=studentRep.GetAll().Join(standardRep.GetAll(),student=>student.StandardRefId,standard=>standard.StandardId,(stud,stand)=>new{Student=stud,Standard=stand})。列表();}这样,您就可以在studentToStandard上获得一个IQueryable,一旦您调用ToList(),它将运行到数据库中。请注意,您必须将相同的上下文传递给两个存储库才能正常工作。我建议你看看工作单元设计模式。在处理多个存储库时,它有很大帮助。https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-在ASP.NETMVC应用程序中,工作模式是一种更有条理和可维护的处理方式,当涉及多个实体集时,并促进更好的关注点分离。希望我能正确理解您的问题,这会有所帮助。以上就是C#学习教程:如何使用通用存储库模式的连接-实体框架分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: