gpt4 book ai didi

entity-framework - EF 4.1 在多对多关系上映射继承

转载 作者:行者123 更新时间:2023-12-04 08:36:03 25 4
gpt4 key购买 nike

令人困惑的情况
我遇到这样一种情况,我有 2 个实体,其中 1 个继承自另一个,需要映射到 2 个单独的表,但代码使用应该围绕这 2 个实体的基础。

详情

public class Team
{
public virtual int Id { get; set; }
public virtual ICollection<Employee> Members { get; set; }
}
public class Employee
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual ICollection<Team> Teams { get; set; }
}

public class EmployeeInfo : Employee
{
public virtual int Id { get; set; }
public virtual decimal Amount { get; set; }
}

我们有一个现有的数据库模式,其中 Employee 和 EmployeeInfo 是单独的表,在 EmployeeInfo_Id 和 Employee_Id 之间有外键。

在我们的系统中,“经理”会将员工的信息添加到系统中,并添加一组私有(private)信息(比上面列出的更多的属性),例如工资,并将他们添加到团队中。系统的其他区域将使用 Team 或 Employee 对象来处理其他各种事情。如果可以完成映射,我们希望代码 super 简单。

当经理创建新员工时,我们希望代码看起来像这样:

public void Foo(string name, decimal pay)
{
// create the employee
var employee = new EmployeeInfo();
employee.Name = name;
employee.Pay = pay;

// add him/her to the team
_team.Employees.Add(employee); // the idea being that consumers of the Team entity would not get the separate employee info properties

// save the context
_context.SaveChanges();
}

最终结果是将 EmployeeInfo 属性输入到 EmployeeInfo 表中,将基本员工数据输入到 Employee 表中并通过关联表 TeamEmployees 添加到团队中。

到目前为止,我正在尝试当前的映射,但我得到了一个名为“Discriminator”的无效列。仅向团队添加员工时。

public class TeamConfiguration : EntityTypeConfiguration<Team>
{
public TeamConfiguration()
{
ToTable("Team");

HasKey(t => t.Id);
HasMany(t => t.Members).WithMany(m => m.Teams)
.Map(m =>
{
m.MapLeftKey("Team_Id");
m.MapRightKey("Employee_Id");
m.ToTable("TeamEmployees");
});
}
}

public class EmployeeConfiguration : EntityTypeConfiguration<Employee>
{
public EmployeeConfiguration()
{
ToTable("Employee");
ToTable("EmployeeInfo");

HasKey(t => t.Id);
Property(p => p.Name);

HasMany(m => m.Teams)
.WithMany(t => t.Members)
.Map(m =>
{
m.MapLeftKey("Employee_Id");
m.MapRightKey("Team_Id");
m.ToTable("TeamEmployees");
});
}
}

此外,如果我将团队和员工之间的多对多排除在混合之外,我会在 Employee_Id 到 EmployeeInfo_Id 上得到一个 FK 异常。

谢谢,JR。

最佳答案

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();
}

最后,从 EmployeeConfiguration 中删除 ToTable("EmployeeInfo"); 部分,因为您已经在模式创建事件中正确提到了这一点。

有关 Table Per Type 方法的更多信息,请查看 this great article .

关于entity-framework - EF 4.1 在多对多关系上映射继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6246212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com