2013-07-28 147 views
1

首先要做的事情是:我已經用全部的術語搜索了全部的答案,所有的術語我都能想到,所以如果以更好的方式提出了我的問題,我表示歉意。創建多個不同實體之間的單向關係到單個實體

說我有持有某種非實體特定的元數據的實體:

public class MetaData 
{ 
    public int Id { get; set; } 
    public string SomeProperty { get; set; } 
} 

,這是由單獨的實體引用:

public class SomeEntity 
{ 
    [???] 
    public string MetaDataId { get; set; } 
} 

public class CompletelyDifferentEntity 
{ 
    [???] 
    public string MetaDataId { get; set; } 
} 

是否有任何屬性,我可以替換???那樣會以代碼優先的方式工作?我是否必須爲每個對象添加一個MetaData屬性來通知EF關係?我試過Required,ForeignKey,InverseProperty,Association attibutes(和其他我忘記)沒有運氣。

如果我需要回到流暢的API來設置它可以在元數據實體上設置它,還是需要分別爲每個實體指定它?

NB:如果我從不需要真正檢索MetaData屬性,答案會不同嗎?即id僅用於分組?

回答

0

爲了映射到你需要在兩個相關的實體,即或者至少一個導航屬性模型中的外鍵關係......

public class MetaData 
{ 
    public int Id { get; set; } 
    public string SomeProperty { get; set; } 

    public ICollection<SomeEntity> SomeEntities { get; set; } 
    public ICollection<CompletelyDifferentEntity> 
     CompletelyDifferentEntities { get; set; } 
} 

......或者......

public class SomeEntity 
{ 
    //... 

    public int MetaDataId { get; set; } 
    public MetaData MetaData { get; set; } 
} 

public class CompletelyDifferentEntity 
{ 
    //... 

    public int MetaDataId { get; set; } 
    public MetaData MetaData { get; set; } 
} 

有了這些屬性名稱數據註解是沒有必要的,因爲EF將識別MetaDataId作爲MetaData導航屬性外鍵屬性。這些關係將是必需的(不是可選的),因爲MetaDataId具有非空類型。

+0

感謝您的回覆。我知道這可以通過向這些實體添加MetaData屬性來工作(如問題中所述),但我正在檢查是否有任何方法不需要這樣做。這意味着將一個永不解決的財產添加到許多實體中,這似乎是一種恥辱。 – JRoughan

+0

@JRoughan:如果你只想在數據庫中有一個外鍵約束,你可以將一個sql腳本添加到一個自定義的上下文初始化器中,或者將它添加到基於代碼的遷移中。 – Slauma

相關問題