我尝试使用流畅的配置在EF Core 2中构建我的第一个Table Splitting。
我有两个名为User
和Customer
的简单实体,我希望在名为" AppUsers"的单个表中使用它们。所以我为两者创建了一个简单的实体类:
User.cs
public partial class User
{
public long Id { get; set; }
public string Name { get; set; }
public Customer Customer { get; set; }
}
和
Customer.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
工作正常,没有控制台错误,但当我尝试运行应用程序时收到此错误:
&#39;用户&#39;的实体正在分享桌子&#39; AppUsers&#39;与&#39;客户&#39;,但没有此类型的实体具有相同的键值,已标记为&#39;已添加&#39;
我无法理解这一点。我的学生刚开始学习关系配置。好吗?
答案 0 :(得分:0)
问题是数据库表中的每一行现在都包含两个实体的字段 - 一个用户和一个客户。这意味着每次创建和保存用户时,也必须创建一个Customer并使用相同的Id保存,因为数据库行不能只包含一个用户,也不能只包含一个客户,它必须同时具有这两个。
< / p>
我在另一种方法中添加了客户种子,这是我的傻瓜。这必须在用户种子中。
var user = new User();
user.Customer = new Customer { Id = user.Id }