2016-10-20 176 views
0

我有一個現有表Employee的情況,由於與現有產品的某些短期兼容性問題,我無法修改該表。EF代碼首先一對一映射

我想添加一個新表EmployeeOptions並將其視爲員工表的一種延續。

[Employee] 
EmpId | FName | LName 

[EmployeeOption] 
EmpId | Option1 | Option2 

對於我的應用我的實際使用情況,我想能夠使用下列方法之一:

emp.Option1 = "123"; 

OR

emp.EmployeeOptions.Option1 = "123: 

我特地到實體分割並且1:1映射上的變體無法完全獲得我正在尋找的內容。 (我發現最近的是here,但由此產生的遷移在我的Employee表中添加了一列)

是否有推薦的方法來執行此操作(或解決方法)?

+1

嘗試'WithRequired'而不是'WithOptionalPrincipal'。 –

回答

1

我認爲這就是它,1:0..1。僱員可具有EmployeeOptions,一個EmployeeOptions必須有一個員工,和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); 
    } 
+0

這個工程!看起來我花了一個下午學習不相關的東西......任何想法如何擺脫這些[ForeignKey]屬性? – Joe

+0

我編輯了答案以添加如何通過使用不同的流暢映射擺脫它們。生成的遷移是相同的。 – Diana