将 UserId 分配给我的子实体会导致 sql table 中的 2n UserId1 列
Assign UserId to my child entity results in a 2n UserId1 column in the sql table
我正在使用
asp.net core
asp.net core identity
entity framework core
我的用户实体有一个子导航 属性 'Projects' 因为一个用户可以有很多项目而一个项目实体有一个用户导航 属性:
public class Project
{
public int Id { get; set; }
public string Name { get; set; }
public User User { get; set; }
}
当我用迁移更新我的数据库时,然后在项目 sql table 中创建了一个 UserId 列,它也是 User.Id.
的外键
这一切都是按照惯例自动发生的。
但是当我想用相关的 userId 保存一个新项目时
context.Projects.Add(project);
project.User.Id = userId; // User is null here
await context.SaveChangesAsync();
我刚得到一个例外。我也可以写:
project.User = new User{ Id = userId };
await context.SaveChangesAsync();
如何在不再次检索整个用户的情况下仅使用该用户 ID 存储该项目实体?
P.S。当我在项目实体中创建一个额外的 UserId 属性 时,会在 sql table 中创建另一个 UserId 列,名称为 'UserId1'.
更新
public class Project
{
public int Id { get; set; }
public string Name { get; set; }
public User User { get; set; }
}
modelBuilder.Entity<Project>().HasOne(x => x.User).WithMany(p => p.Projects).IsRequired();
你快到了。如果您按此顺序使用您的代码:
context.Projects.Add(project);
project.User = new User{ Id = userId };
await context.SaveChangesAsync();
...你只需再添加一行:
context.Projects.Add(project);
project.User = new User{ Id = userId };
context.Attach(project.User);
await context.SaveChangesAsync();
现在 Entity Framework 知道该用户是现有用户,它将使用其 ID
作为 project
的外键。在这种情况下,project.User
是所谓的 存根实体:一个不完整的实体对象,用于避免往返数据库。
作为替代方案,您可以将 属性 UserId
添加到 Project
,EF 会将其拾取为属于 Project.User
的外键。
我正在使用
asp.net core
asp.net core identity
entity framework core
我的用户实体有一个子导航 属性 'Projects' 因为一个用户可以有很多项目而一个项目实体有一个用户导航 属性:
public class Project
{
public int Id { get; set; }
public string Name { get; set; }
public User User { get; set; }
}
当我用迁移更新我的数据库时,然后在项目 sql table 中创建了一个 UserId 列,它也是 User.Id.
的外键这一切都是按照惯例自动发生的。
但是当我想用相关的 userId 保存一个新项目时
context.Projects.Add(project);
project.User.Id = userId; // User is null here
await context.SaveChangesAsync();
我刚得到一个例外。我也可以写:
project.User = new User{ Id = userId };
await context.SaveChangesAsync();
如何在不再次检索整个用户的情况下仅使用该用户 ID 存储该项目实体?
P.S。当我在项目实体中创建一个额外的 UserId 属性 时,会在 sql table 中创建另一个 UserId 列,名称为 'UserId1'.
更新
public class Project
{
public int Id { get; set; }
public string Name { get; set; }
public User User { get; set; }
}
modelBuilder.Entity<Project>().HasOne(x => x.User).WithMany(p => p.Projects).IsRequired();
你快到了。如果您按此顺序使用您的代码:
context.Projects.Add(project);
project.User = new User{ Id = userId };
await context.SaveChangesAsync();
...你只需再添加一行:
context.Projects.Add(project);
project.User = new User{ Id = userId };
context.Attach(project.User);
await context.SaveChangesAsync();
现在 Entity Framework 知道该用户是现有用户,它将使用其 ID
作为 project
的外键。在这种情况下,project.User
是所谓的 存根实体:一个不完整的实体对象,用于避免往返数据库。
作为替代方案,您可以将 属性 UserId
添加到 Project
,EF 会将其拾取为属于 Project.User
的外键。