我在我的应用程序中使用 Entity Framework Core 和 SQL Server。我非常熟悉外键,但我想学习为基于类型的实体提供外键的正确方法。
例如:
家长课
AppUser
:
CREATE TABLE AppUser
(
Id INT NOT NULL PRIMARY KEY IDENTITY(1, 1),
Name VARCHAR(255) NOT NULL,
UserTypeId SMALLINT NOT NULL -- !This is the important part for me! if 0 = Student if 1 = Teacher
);
CREATE TABLE Student
(
Id INT NOT NULL PRIMARY KEY IDENTITY(1, 1),
AppUserId INT NOT NULL,
CONSTRAINT FK_Student_AppUser FOREIGN KEY (AppUserId)
REFERENCES AppUser(Id)
);
CREATE TABLE Teacher
(
Id INT NOT NULL PRIMARY KEY IDENTITY(1, 1),
AppUserId INT NOT NULL,
CONSTRAINT FK_Student_AppUser FOREIGN KEY (AppUserId)
REFERENCES AppUser(Id)
);
我的问题:有没有更好的方式来维持这种关系。因为在实体框架中,当我尝试获取用户时,我总是需要检查
TypeId
并有一个用于该类型的 if else 块,然后对表 Student 或 Teacher 进行查询。任何建议都会很棒。谢谢!
根据你的表结构,如果你想通过AppUser Id获取student,可以直接使用这段代码:
var data = _context.Student.Include(x => x.AppUser).Where(x => x.AppUserId == userId).FirstOrDefault();
接下来只需区分
data
的参数即可。
如果data为
null
,则代表AppUser的Id不是学生而是老师(表示UserTypeId字段值为1),否则,你可以更新你想要的学生字段。
if (data != null)
{
//update student
}
这是我的一个老问题,但我要求的是在 Entity Framework Core 中使用 Discriminator 或 Table Per Type Configuration。