2017-01-05 30 views
0

我有一個遺留數據庫,它破壞了Codd的所有規則。下面是實體非零密鑰上的EF零對一FLUENT API外鍵

class Item { 
     [Key]   
     public int ItemId {get;set;} 

     public string ItemNo {get;set; } 

     [ForeignKey("ItemId")] 
     public virtual NumericItem {get;set;} //navigation 

} 


class NumericItem { //This is a subset of the Item entity 

     [ForeignKey("ItemId")] 
     public Item Item {get; set;} 

     [Key]   
     public int ItemNo { get; set; } //this is a primary key, different type 

     public int ItemId { get; set; } //this is also a primary key and a foreign key 

} 

我如何告訴EF代碼首先使用NumericItem總是有一個項目和項目可能會或可能不會有NumericItem流利的API。基數總是爲零/一個

回答

0

這是外國唯一密鑰的情況。

通常,當您擁有關係爲0或1的主體(如Item)和可選的從屬(NumericItem)時,相關主鍵也是主體的外鍵。在你的情況下,由於數據庫已經是這樣的,你可以這樣做:

public class Item 
{ 
    public int ItemId { get; set; } 

    public string ItemNo { get; set; } 

    public virtual NumericItem NumericItem {get;set;} //navigation 

} 


public class NumericItem 
{ //This is a subset of the Item entity 

    public Item Item { get; set; } 

    public int ItemNo { get; set; } //this is a primary key, different type 

} 

public class NumericItemConfiguration : EntityTypeConfiguration<NumericItem> 
{ 

    public NumericItemConfiguration() 
    { 
     HasKey(n => n.ItemNo); 

     HasRequired(n => n.Item).WithOptional(i => i.NumericItem).Map(m => m.MapKey("ItemId")); 

    } 

} 

public class MyContextContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // do your stuff, and add your configuration here... 

     modelBuilder.Configurations.Add(new NumericItemConfiguration()); 

    } 
} 

,或者你可以直接在OnModelCreating方法做沒有這個NumericItemConfiguration類,這樣的配置:

public class MyContextContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     // do your stuff, and add your configuration here... 

     modelBuilder.Entity<NumericItem>().HasKey(n => n.ItemNo); 

     modelBuilder.Entity<NumericItem>().HasRequired(n => n.Item).WithOptional(i => i.NumericItem); 

    } 
} 

注意我不得不NumericItem類中刪除您ItemId財產,否則EF會抱怨這樣的:

項目Id:名稱:每個屬性ñ一個類型中的ame必須是唯一的。屬性 名稱'ItemId'已被定義。

+0

另外,如果這是你想要的東西,請不要忘記,以紀念答案接受;) – Alisson

+0

我得到一個FK Constriant未發現關聯「NumericItem_Item」 - 必須直接在模型指定的外鍵能夠應用這個過濾器 – user3924036

+0

你能提供這兩個表的CREATE TABLE sql腳本嗎?我運行'更新數據庫',它運行良好。 – Alisson