配置在EF Core 2中使用Table Splitting的关系

时间:2018-03-08 19:01:41

标签: c# entity-framework entity-framework-core ef-fluent-api

我尝试使用流畅的配置在EF Core 2中构建我的第一个Table Splitting。
我有两个名为UserCustomer的简单实体,我希望在名为" 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;

我无法理解这一点。我的学生刚开始学习关系配置。好吗?

1 个答案:

答案 0 :(得分:0)

问题是数据库表中的每一行现在都包含两个实体的字段 - 一个用户和一个客户。这意味着每次创建和保存用户时,也必须创建一个Customer并使用相同的Id保存,因为数据库行不能只包含一个用户,也不能只包含一个客户,它必须同时具有这两个。
< / p>

我在另一种方法中添加了客户种子,这是我的傻瓜。这必须在用户种子中。

var user = new User(); user.Customer = new Customer { Id = user.Id }