2016-10-20 6 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

'WithOptionalPrincipal'の代わりに' WithRequired'を試してみてください。 –

答えて

1

これは1:0..1と思う。従業員はEmployeeOptions従業員を持っている必要があり、従業員のテーブルを移動することによって放置され、EmployeeOptionsを有していてもよい:

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

EDIT:以下を使用して上記のものの代わりに流暢なマッピングを使用すると、[ForeignKey]属性を削除できます:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<EmployeeOption>() 
      .HasRequired(e => e.Employee) 
      .WithOptional(e => e.EmployeeOption); 
    } 
+0

これは機能します!私は午後、無関係なことを学んでいたようです...それらの[ForeignKey]属性を取り除く方法を考えていますか? – Joe

+0

別の流暢なマッピングを使用してそれらを取り除く方法を追加する答えを編集しました。生成された移行は同じです。 – Diana