Discriminator
- это столбец, который добавляется в вашу таблицу при использовании подхода Table Per Hierarchy
.
Я думаю, что вы ищете "Таблица за тип (TPT)". Украсьте свой EmployeeInfo
класс следующим образом:
[Table("EmployeeInfo")]
public class EmployeeInfo : Employee
Или добавьте ниже к вашему OnModelCreating
событию:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
...
modelBuilder.Entity<EmployeeInfo>().ToTable("EmployeeInfo");
...
}
Или создайте следующий класс и используйте его как modelBuilder.Configurations.Add(new EmployeeInfoConfiguration());
в OnModelCreating
методе:
public class EmployeeInfoConfiguration : EntityTypeConfiguration<EmployeeInfo>
{
public EmployeeInfoConfiguration()
{
ToTable("EmployeeInfo");
}
}
Это заставит EF создать EmployeeInfo
таблицу с необходимыми ограничениями.
Также хорошо инициализировать ваши коллекции в конструкторах ваших объектов, чтобы исключить нулевое исключение. Например, в Team
классе:
public Team()
{
this.Employees = new HashSet<Employee>();
}
Я точно скопировал ваш код и изменил следующие части:
public class Team
{
public Team()
{
this.Members = new HashSet<Employee>();
}
public virtual int Id { get; set; }
public virtual ICollection<Employee> Members { get; set; }
}
public class Employee
{
public Employee()
{
this.Teams = new HashSet<Team>();
}
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual ICollection<Team> Teams { get; set; }
}
[Table("EmployeeInfo")]
public class EmployeeInfo : Employee
{
public virtual int Id { get; set; }
public virtual decimal Amount { get; set; }
}
В DbContext без изменений:
public partial class TestEntities : DbContext
{
public DbSet<Employee> Employees { get; set; }
public DbSet<EmployeeInfo> Employee_Info { get; set; }
public DbSet<Team> Teams { get; set; }
}
и ваш рабочий Foo
метод:
public static void Foo(string name, decimal pay)
{
var _team = new Team();
var context = new TestEntities();
context.Teams.Add(_team);
// create the employee
var employee = new EmployeeInfo();
employee.Name = name;
employee.Amount = pay;
context.Employees.Add(employee);
context.SaveChanges();
// add him/her to the team
_team.Members.Add(employee);
// save the context
context.SaveChanges();
}
Наконец, удалите ToTable("EmployeeInfo");
деталь из EmployeeConfiguration
, поскольку вы правильно упомянули об этом в своем событии создания режима.
Для получения дополнительной информации о подходе Table Per Type, прочитайте эту замечательную статью .