考虑以下两个实体
1 n
Department -----> Student
假设基于此结构存在大量遗留代码。
现在假设必须引入新的entiy,Univeristy
:
1 n 1 n
Univeristy ------> Department -----> Student
但是, University
必须表现得像上下文,而不仅仅是普通实体,方式如下。
每当系统的用户将自己认证为属于Univeristy X并调用其中一种遗留方法时,必须仅授予那些(直接或间接)属于大学X的实体的访问权限。上下文一直存在直到用户注销。 (这是一个Web应用程序。)
所以,例如像
这样的行 dbContext.Set<Student>()
我有哪些选择?修改遗留代码不是一种选择。
答案 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。搜索实体框架工作单元,看看我的意思。