2011-05-12 133 views
4
class First 
{ 
    [Key] 
    public int Id { get; set; } 
} 

class Second 
{ 
    [Key] 
    public int Id { get; set; } 

    public int? First_Id { get; set; } 

    [ForeignKey("First_Id")] 
    public First First { get; set; } 
} 

public class SecondMapping : EntityTypeConfiguration<Second> 
{ 
    public SecondMapping() 
     : base() 
    { 
     this.HasOptional(s => s.First) 
      .With ... ??? 
    } 
} 

第二個可能對第一個有參考。但首先從來沒有提及第二。是否可以將這個映射與Entity Framework 4.1一起使用?實體框架0..1至0關係

編輯: 以前,這是我的解決方案:

this.HasOptional(s => s.First) 
    .WithOptionalDependent() 
    .WillCascadeOnDelete(false); 

其次可以包含首先的一個實例(依賴於某種用途屬性的)。首先不包含Second的任何實例。

回答

10

僅當外鍵也是從屬實體的主鍵時纔有可能一對一關係。所以,正確的映射是:

class First 
{ 
    [Key] 
    public int Id { get; set; } 
} 

class Second 
{ 
    [Key, ForeignKey("First")] 
    public int Id { get; set; } 
    public First First { get; set; } 
} 

的原因是,執行數據庫中的外鍵一個一對一的關係必須是Second實體獨特。但實體框架不支持唯一鍵 - EF唯一的唯一值是主鍵。這是EF的限制。

Morteza Manavi's blog上描述瞭解決方法。解決方法是基於將關聯映射爲一對多,並通過在自定義數據庫初始化器中引入唯一約束來實施數據庫中的唯一性。

+0

用在EF語言:它不應該是一個可選的:在關係的另一端沒有導航屬性的可選關係? – 0xbadf00d

+0

一旦將FK放置在PK上,它就不能成爲可選的可選項 - 必須定義PK並且必須定義具有相同PK值的主體實體。 –

+0

我編輯了我的帖子來更詳細地描述我的問題。請注意。 – 0xbadf00d

0

如果你想實現1對1的關係,那裏是關聯到First實體最多隻有一個Second的實體,在沒有相反的屬性嘗試以下操作:

class First 
{ 
    [Key] 
    public Guid FirstId { get; set; } 
} 

class Second 
{ 
    [Key] 
    public Guid FirstId { get; set; } 
    public First First { get; set; } 
} 

class SecondMapping : EntityTypeConfiguration<Second> 
{ 
    public SecondMapping() 
    { 
     this.HasRequired(s => s.First); 
    } 
} 

但是,您可以使用單獨的First_id列來執行此類關聯,但您可以有效創建1對N關係。它可以通過UNIQUE約束被強制爲1:1,但由於EF中的限制,您將無法創建反向屬性(如Ladislav提到的):

class SecondMapping : EntityTypeConfiguration<Second> 
{ 
    public SecondMapping() 
    { 
     this.HasRequired(s => s.First).WithMany().HasForeignKey("First_id"); 
    } 
} 
+0

請注意我在Ladislav Mrnkas上面的回答。 – 0xbadf00d