将 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 的外键。