0

I have a situation where I have an existing table Employee that I am unable to modify due to some short-term compatibility issues with an existing product.

I would like to add a new table EmployeeOptions and treat it as a sort of continuation of the employee table.

[Employee]
EmpId | FName | LName 

[EmployeeOption]
EmpId | Option1 | Option2

For my actual usage in my application, I would like to be able to use either of the following approaches:

emp.Option1 = "123";

OR

emp.EmployeeOptions.Option1 = "123:

I have looked into Entity Splitting and variations on 1:1 mappings haven't been able to quite get what I am looking for. (The closest I found was here, but the resulting migration added a column to my Employee table)

Is there a recommended way to do this (or a workaround)?

Community
  • 1
  • 1
Joe
  • 5,389
  • 7
  • 41
  • 63

1 Answers1

1

I think this is it, 1:0..1. An Employee may have an EmployeeOptions, an EmployeeOptions must have an Employee, and Employee table is left untouched by the migration:

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

Generated tables (migration):

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

EDIT: by using the following fluent mapping instead of the one above you can remove both [ForeignKey] attributes:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<EmployeeOption>()
            .HasRequired(e => e.Employee)
            .WithOptional(e => e.EmployeeOption);
    }
Diana
  • 2,186
  • 1
  • 20
  • 31
  • This works! Looks like I spent an afternoon learning unrelated things...Any idea how to get rid of those [ForeignKey] attributes? – Joe Oct 20 '16 at 21:57
  • I edited the answer to add how to get rid of them by using a different fluent mapping. The generated migration is the same. – Diana Oct 24 '16 at 19:02