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表添加了一列)

是否有推荐的方法来做到这一点(或解决方案)?

EF Code First一对一映射

我想就是这样,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);
    }