鉴于以下表格:
SCHOOL
schoolid (int PK)
name
TEACHER
teacherId (int PK)
name, homeRoomId (fk varchar10)
subjectId (fk varchar10)
schoolid (FK int)
HOMEROOM
homeRoomId (PK varchar10)
roomNumber
active
SUBJECT
subjectId (PK varchar10)
name
active
我在MVC应用中使用EF6。我启用了延迟加载。我正在尝试返回给定SchoolId
的所有教师的列表,我需要为每位教师添加教室和主题数据。
一所学校包含许多教师,一名教师只为一所学校工作,一名教师只有一所教室,只教一门科目。教室和主题ID是varchars,因为它们是预先存在的ID,如下所示:SUBJECT:A03,Math。
我的代码可以加载所有教师的教室和主题schoolid
:
public List<TeacherModel> GetTeachersBySchool(int schoolId)
{
List<TeacherModel> teachers = new List<TeacherModel>();
using (var db = new myDBEntities())
{
var list = db.Teacher.Where(a => a.SchoolId == schoolId).ToList();
foreach ( var s in list)
{
TeacherModel teacher = new TeacherModel()
{
TeacherId = s.TeacherId,
Name = s.Name,
HomeRoomId = s.HomeRoomId,
HomeRoomNumber = s.HomeRoom.RoomNumber,
SubjectId = s.SubjectId,
SubjectName = s.Subject.Name
};
teachers.Add(teacher);
}
return teachers;
}
}
即使通过数据库中的sql查询为该教师返回一行,主教室实体正在加载,但是主体实体为空。由于null主体实体,查询错误作为对象引用未设置为blah blah。
我发现问题似乎是在SubjectId包含字母字符时。主题的几个例子是:“A03”或“1001023”。第二个实体将加载,第一个不会。我假设即使数据类型是字符串/ varchar,EF6也会提取数值并将其作为id传递,因此如果ID具有alpha,则会失败。
这是jibe吗?我如何解决它?作为最后的手段,我可以添加一个代理键(INT Identity 1,1)用于这些实体,但我希望还有另一种方法。