Esc*_*ar5 13 c# entity-framework asp.net-web-api asp.net-identity asp.net-identity-2
我有以下实体:
public class ApplicationUser : IdentityUser
{
...
public int? StudentId { get; set; }
public virtual Student Student { get; set; }
}
public class Student
{
public int Id { get; set; }
public string UserId { get; set; }
public virtual ApplicationUser User { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个新的应用程序用户和学生,所以我这样做:
var user = new ApplicationUser() {
Name = "test",
UserName = "test",
Student = new Student ()
};
var result = await userManager.CreateAsync(user, "test12345!");
Run Code Online (Sandbox Code Playgroud)
结果成功,两个实体插入数据库,但Student.UserId为null
如何插入实体及其关系?
我尝试设置student.UserId = user.Id,但后来我收到此消息的异常:"无法确定依赖操作的有效排序"
这里提供了一个问题和一个解决方案,一对一的关系和使用默认约定的可选从属端,这里是EF Code First - 1对1可选关系.但是,让我在这个问题上添加一些内容.
实体设计在ApplicationUser相关的db表中创建冗余,但更重要的是,它会在两个表之间创建外键关系循环.虽然技术上可以处理这种关系,但这是一个维护的噩梦,应该避免.
EF代码第一种方法的优点是你不必考虑这些事情.不要尝试像db表那样设计POCO.除主键外,请勿使用xxxId属性.使用正确配置的导航属性来表达实体之间的关系,让EF处理数据库设计.
考虑到这一切:
首先,StudentId从ApplicationUser类中删除类和UserId属性中的属性Student.请注意,这将从StudentId相应的db表中删除该列,因此您可以考虑从新数据库开始或使用迁移.
然后使用以下配置:
modelBuilder.Entity<ApplicationUser>()
.HasOptional(u => u.Student)
.WithRequired(s => s.User).Map(a => a.MapKey("UserId"));
Run Code Online (Sandbox Code Playgroud)
你的问题应该解决.