gpt4 book ai didi

c# - 使用 ApplicationUser 插入依赖实体

转载 作者:可可西里 更新时间:2023-11-01 08:09:37 24 4
gpt4 key购买 nike

我有以下实体:

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; }
}

我正在尝试创建一个新的应用程序用户和学生,所以我这样做:

var user = new ApplicationUser() {
Name = "test",
UserName = "test",
Student = new Student ()
};

var result = await userManager.CreateAsync(user, "test12345!");

结果成功,两个实体都被插入到数据库中,但是Student.UserId为空

如何插入实体及其关系?

我尝试设置 student.UserId = user.Id,但随后我收到一条异常消息:“无法确定相关操作的有效顺序”

最佳答案

这里提供了问题和解决方案One-to-one relationsip with optional dependent end using default conventions在这里 EF Code First - 1-to-1 Optional Relationship .但是,让我为这个主题补充一些内容。

您的实体设计在 ApplicationUser 相关的数据库表中创建了冗余,但更重要的是,它在两个表之间创建了一个外键关系循环。虽然处理这种关系在技术上是可行的,但这是维护的噩梦,应该避免。

EF 代码优先方法的美妙之处在于您不必考虑这些事情。不要尝试将您的 POCO 设计为数据库表。除主键外,不要使用 xxxId 属性。使用正确配置的导航属性 来表达您的实体之间的关系,并让 EF 负责数据库设计。

考虑到所有这些:

首先,从 ApplicationUser 类中删除 StudentId 属性,从 Student 类中删除 UserId 属性。请注意,这将从相应的数据库表中删除 StudentId 列,因此您可能会考虑从一个新的数据库开始或使用迁移。

然后使用如下配置:

modelBuilder.Entity<ApplicationUser>()
.HasOptional(u => u.Student)
.WithRequired(s => s.User).Map(a => a.MapKey("UserId"));

你的问题应该已经解决了。

关于c# - 使用 ApplicationUser 插入依赖实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32281397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com