重构代码,以便顶部实体的行为类似于上下文

时间:2013-11-20 18:10:04

标签: c# sql asp.net-mvc entity-framework orm

考虑以下两个实体

           1    n
Department -----> Student

假设基于此结构存在大量遗留代码。

现在假设必须引入新的entiy,Univeristy

           1     n            1    n
Univeristy ------> Department -----> Student
但是,

University必须表现得像上下文,而不仅仅是普通实体,方式如下。 每当系统的用户将自己认证为属于Univeristy X并调用其中一种遗留方法时,必须仅授予那些(直接或间接)属于大学X的实体的访问权限。上下文一直存在直到用户注销。 (这是一个Web应用程序。)

所以,例如像

这样的行

dbContext.Set<Student>()

遗留代码中的某个地方应该只返回属于X大学的学生。

我有哪些选择?修改遗留代码不是一种选择。

1 个答案:

答案 0 :(得分:0)

很难在不知道遗留代码如何适应图片的情况下给出精确的答案,但我会试一试。

根据数据库的设置方式(例如,如果学生数据库表中有大学ID),您可以只添加学生导航属性。

public class University
{
    public virtual int Id { get; set; }

    public virtual ICollection<Department> Departments { get; set; }

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

如果这不起作用,您可以尝试通过部门访问所有学生:

public class University
{
    public virtual int Id { get; set; }

    public virtual ICollection<Department> Departments { get; set; }

    public virtual ICollection<Student> Students 
    {
        get { return Departments.SelectMany(d => d.Students); }
    }
}

然而,这可能效率较低。

最后,您可以使用存储库模式并创建一个StudentRepository,它允许您运行各种查询以获取学生。

public class StudentRepository
{
      public IEnumerable<Student>  GetStudents(University university) 
      {
           return dbContext.Set<Student>().Where(s => s.Department.University.Id == university.Id);
      }
}

我要做的另一个建议是在用户登录的整个时间内没有DbContext。我会为每个Web请求创建一个DbContext。搜索实体框架工作单元,看看我的意思。