C# 使用现有基类实例的EntityFramework继承
我在我的模型中使用TPT策略 以下是我的背景: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) {
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();
}