我正在尝试使用流畅的配置在EF Core 2中构建我的第一个表拆分。
我有两个名为 User
和 Customer
的简单实体,我想在名为"AppUsers"的单个表中使用它们。所以我为两者创建了一个简单的实体类:
用户.cs
public partial class User
{
public long Id { get; set; }
public string Name { get; set; }
public Customer Customer { get; set; }
}
和:
客户.cs
public partial class Customer
{
public long Id { get; set; }
public Guid CustomerGuid { get; set; }
public User User { get; set; }
}
然后我对MyDbContext
进行更改,如下所示:
MyDbContext.cs
public class MyDbContext : DbContext
{
public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasOne(c => c.Customer).WithOne(c => c.User)
.HasForeignKey<Customer>(e => e.Id);
modelBuilder.Entity<User>().ToTable("AppUsers");
modelBuilder.Entity<Customer>().ToTable("AppUsers");
base.OnModelCreating(modelBuilder);
}
}
然后我使用 Add-Migration "Simple_Test"
创建了一个迁移,没有错误。所以我运行了Update-Database
没有控制台错误的情况下运行良好的方法,但是当我尝试运行应用程序时出现此错误:
">用户"的实体与"客户"共享表"AppUsers",但没有此类型的实体具有标记为"已添加"的相同键值
我无法理解这一点。我是学生,刚开始学习关系配置。请问有什么想法吗?
问题是数据库表中的每一行现在都包含来自两个实体的字段 - 一个用户和一个客户。这意味着每次创建和保存用户时,还必须使用相同的 ID 创建和保存客户,因为数据库行不能只保存用户或仅包含客户,它必须同时包含两者。
我用另一种方法添加了客户种子,这是我的傻瓜。那必须在用户种子中。
var user = new User();
user.Customer = new Customer { Id = user.Id }