EF Code First一对一映射
本文关键字:映射 一对一 First Code EF | 更新日期: 2023-09-27 18:13:59
我有一个现有的表Employee
,由于与现有产品的一些短期兼容性问题,我无法修改。
我想添加一个新表EmployeeOptions
,并将其作为雇员表的延续。
[Employee]
EmpId | FName | LName
[EmployeeOption]
EmpId | Option1 | Option2
对于我在应用程序中的实际使用,我希望能够使用以下方法中的任何一种:
emp.Option1 = "123";
或
emp.EmployeeOptions.Option1 = "123:
我已经研究了实体分裂和1:1映射的变化,还没有能够得到我正在寻找的东西。(我发现最接近的是这里,但是最终的迁移向我的Employee表添加了一列)
是否有推荐的方法来做到这一点(或解决方案)?
我想就是这样,1:0..1。一个Employee可以有一个EmployeeOptions,一个EmployeeOptions必须有一个Employee,并且Employee表不受迁移的影响:
public class Employee
{
[Key]
public int EmpId { get; set; }
public string FName { get; set; }
public string LName { get; set; }
[ForeignKey("EmpId")]
public virtual EmployeeOption EmployeeOption { get; set; }
}
public class EmployeeOption
{
[Key]
public int EmpId { get; set; }
public string Option1 { get; set; }
public string Option2 { get; set; }
[ForeignKey("EmpId")]
public virtual Employee Employee { get; set; }
}
public class ExampleContext : DbContext
{
public ExampleContext() : base("DefaultConnection") { this.Configuration.ProxyCreationEnabled = false; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Employee>()
.HasOptional(o => o.EmployeeOption)
.WithOptionalPrincipal(e => e.Employee);
}
public DbSet<Employee> Employees { get; set; }
public DbSet<EmployeeOption> EmployeeOptions { get; set; }
}
生成表(迁移):
CreateTable(
"dbo.EmployeeOptions",
c => new
{
EmpId = c.Int(nullable: false),
Option1 = c.String(),
Option2 = c.String(),
})
.PrimaryKey(t => t.EmpId)
.ForeignKey("dbo.Employees", t => t.EmpId)
.Index(t => t.EmpId);
CreateTable(
"dbo.Employees",
c => new
{
EmpId = c.Int(nullable: false, identity: true),
FName = c.String(),
LName = c.String(),
})
.PrimaryKey(t => t.EmpId);
编辑:通过使用以下流畅映射而不是上面的映射,您可以删除两个[ForeignKey]属性:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<EmployeeOption>()
.HasRequired(e => e.Employee)
.WithOptional(e => e.EmployeeOption);
}