使用ApplicationUser插入依赖实体

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,但后来我收到此消息的异常:"无法确定依赖操作的有效排序"

Iva*_*oev 9

这里提供了一个问题和一个解决方案,一对一的关系和使用默认约定的可选从属端,这里是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)

你的问题应该解决.