C# 使用现有基类实例的EntityFramework继承

C# 使用现有基类实例的EntityFramework继承,c#,entity-framework,ef-code-first,table-per-type,C#,Entity Framework,Ef Code First,Table Per Type,我在我的模型中使用TPT策略 以下是我的背景: public class MyTestContext : DbContext { public DbSet<Person> Persons { get; set; } public DbSet<Seller> Sellers { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) {

我在我的模型中使用TPT策略

以下是我的背景:

public class MyTestContext : DbContext
{
    public DbSet<Person> Persons { get; set; }
    public DbSet<Seller> Sellers { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
        modelBuilder.Entity<Person>().ToTable("Persons");
        modelBuilder.Entity<Seller>().ToTable("Sellers");
        base.OnModelCreating(modelBuilder);
    }
}
我试图重用已经存在的数据库寄存器。 我有两个积垢,一个给人,另一个给卖家

情景:

我的数据库中有10个人和0个卖家,如以下种子:

using (var ctx = new MyTestContext())
{
    Func<int, Person> selector = i => new Person
    {
        Name = string.Format("Person {0}", i)
    };
    var persons = Enumerable.Range(1, 10).Select(selector);
    ctx.Persons.AddRange(persons);

    ctx.SaveChanges();
}
当实体框架保存时,他创建了一个新的人和一个新的卖家


我如何使用继承策略并能够使用我在Seller中分配的Id来创建一个新的人并使用这个新Id?

您不能对一对一或零关系使用TPT

因为能够有一对一或零的关系。您需要在
Person
上设置
Seller
属性,在
Seller
上设置
Person
属性

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Seller Seller { get; set; }
}
public class Seller : Person
{
    public decimal Comissao { get; set; }
    public Person Person { get; set; }
}
但上述代码不起作用,因为人身上的
卖方
财产也将继承给
卖方
,并将其视为另一种关系

解决方案
  • 另一个抽象类名为
    BasePerson
  • Person
    Seller
    都源自
    BasePerson
  • 使用每个具体类的表映射
这些是课程

public abstract class BasePerson
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class Person : BasePerson
{
    public Seller Seller { get; set; }
}
public class Seller : BasePerson
{
    public decimal Comissao { get; set; }
    public Person Person { get; set; }
}    
public class AppContext : DbContext
{
    public DbSet<Person> People { get; set; }
    public DbSet<Seller> Sellers { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Configures one to one-or-zero relationship.
        modelBuilder.Entity<Seller>().HasRequired(x => x.Person).WithRequiredDependent(x => x.Seller);
    }
}
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Seller Seller { get; set; }
}
public class Seller : Person
{
    public decimal Comissao { get; set; }
    public Person Person { get; set; }
}
public abstract class BasePerson
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class Person : BasePerson
{
    public Seller Seller { get; set; }
}
public class Seller : BasePerson
{
    public decimal Comissao { get; set; }
    public Person Person { get; set; }
}    
public class AppContext : DbContext
{
    public DbSet<Person> People { get; set; }
    public DbSet<Seller> Sellers { get; set; }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // Configures one to one-or-zero relationship.
        modelBuilder.Entity<Seller>().HasRequired(x => x.Person).WithRequiredDependent(x => x.Seller);
    }
}
using (var context = new AppContext())
{
    context.People.Add(new Person { Id = 1 });
    context.SaveChanges();
}
using (var context = new AppContext())
{
    context.Sellers.Add(new Seller { Id = 1 });
    context.SaveChanges();
}
using (var context = new AppContext())
{
    // Throws DBUpdateException, Person Id = 2 doesn't exist.
    context.Sellers.Add(new Seller { Id = 2 });
    context.SaveChanges();
}