gpt4 book ai didi

c# - 如何使用连接与通用存储库模式 - Entity Framework

转载 作者:太空宇宙 更新时间:2023-11-03 17:13:16 25 4
gpt4 key购买 nike

我有一个 Generic Repository,如下所示,它处理我的 CRUD,对于单个实体,它易于使用,当我尝试加入我的 POCO 时,问题就开始了

假设我有这些 POCO,它们是使用流畅的 api 映射的(多对多和一对多关系):

public class Student
{
public Student()
{
this.Courses = new HashSet<Course>();
}

public int StudentId { get; set; }
public string StudentName { get; set; }

//FKs
public virtual Standard Standard { get; set; }
public int StdandardRefId { get; set; }

public virtual ICollection<Course> Courses { get; set; }
}

public class Course
{
public Course()
{
this.Students = new HashSet<Student>();
}

public int CourseId { get; set; }
public string CourseName { get; set; }

public virtual ICollection<Student> Students { get; set; }
}
public class Standard
{
public Standard()
{
Students = new List<Student>();
}
public int StandardId { get; set; }
public string Description { get; set; }

public virtual ICollection<Student> Students { get; set; }
}

映射:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//Many-To-Many
modelBuilder.Entity<Student>()
.HasMany<Course>(s => s.Courses)
.WithMany(c => c.Students)
.Map(cs =>
{
cs.MapLeftKey("StudentRefId");
cs.MapRightKey("CourseRefId");
cs.ToTable("StudentCourse");
});
//One-To-Many
modelBuilder.Entity<Student>()
.HasRequired<Standard>(s => s.Standard)
.WithMany(s => s.Students)
.HasForeignKey(s => s.StandardId);

}

通用存储库:

public class Repository<T> : IRepository<T>
where T : class, IDisposable
{
internal MyDbContext context;
internal DbSet<T> dbSet;

public Repository()
{
context = new MyDbContext();
this.dbSet = context.Set<T>();
}

public bool Add(T entity)
{
var query = dbSet.Add(entity);

if (query != null)
return true;
return false;
}

public bool Update(T entity)
{
dbSet.Attach(entity);
var query = context.Entry(entity).State = EntityState.Modified;

if (query == EntityState.Modified)
return true;
return false;
}
public bool Delete(T entity)
{
var query = dbSet.Remove(entity);

if (query != null)
return true;
return false;
}
public bool Delete(Guid id)
{
var query = dbSet.Remove(dbSet.Find(id));

if (query != null)
return true;
return false;
}
public T GetById(Guid id)
{
var query = dbSet.Find(id);

if (query != null)
return query;
else
return null;
}
public ICollection<T> GetAll()
{
return dbSet.AsEnumerable<T>().ToList();
}

public void Save()
{
context.SaveChanges();
}
public void Dispose()
{
if (context != null)
{
context.Dispose();
context = null;
}
}
}

现在如果我想将标准连接到多对多表,我应该怎么做?

最佳答案

因此,根据您的编辑,我假设您愿意加入 Students and Standards。

您要做的第一件事是更改存储库,使其不会实例化上下文。您应该将其作为参数传入并存储对它的引用:

public Repository(MyDbContext myCtx)
{
context = myCtx;
this.dbSet = context.Set<T>();
}

您要做的第二件事是更改存储库以更改 GetAll()返回方法 IQueryable<T>而不是 ICollection<T> .

然后更改GetAll()的实现:

return dbSet;

这样你只能得到一个查询,而不是所有实体的评估列表。然后您可以使用 GetAll() 进行连接存储库的方法就像您使用数据库集一样:

using (MyDbContext ctx = new MyDbContext())
{
var studentRep = new Repository<Student>(ctx);
var standardRep = new Repository<Standard>(ctx);
var studentToStandard = studentRep.GetAll().Join(standardRep.GetAll(),
student => student.StandardRefId,
standard => standard.StandardId,
(stud, stand) => new { Student=stud, Standard=stand }).ToList();
}

有了这个,你会得到一个 IQueryable<T>studentToStandard ,一旦您调用 ToList(),它将在数据库中运行在上面。请注意,您必须将相同的上下文传递给两个存储库才能使其正常工作。

我建议您也查看工作单元设计模式。它在处理多个存储库时很有帮助。

https://learn.microsoft.com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

当涉及多个实体集时,这是一种更加结构化且更易于维护的处理事务的方式,并促进了更好的关注点分离。

希望我正确理解了您的问题,这对您有所帮助。

关于c# - 如何使用连接与通用存储库模式 - Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42733341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com