2010-05-31 144 views
12

我有一個POCO(普通老式CLR對象)實體框架4 POCO與字典

public Foo 
{ 
    public virtual int Id { get; set; } 
    public virtual Dictionary<string, string> Stuff { get; set; } 
    public virtual string More { get; set; } 
} 

使用model first方法(即我沒有一個數據模型還),如何將我處理堅持的東西(字典)?

回答

7

這不是問題的真實答案,但由於沒有其他答覆,我會分享我所做的。

我只是簡單地創建了一個新類型{Id, Code, Text},並將我的字典替換爲該類型的列表。然後我做這樣的事情拿到鑰匙,價值觀,或者做一個查詢:

List<string> texts = (from sv in q.SelectableValues select sv.Text).ToList(); 
List<string> codes = (from sv in q.SelectableValues select sv.Code).ToList(); 
string text = (from sv in q.SelectableValues where sv.Code == "MyKey" select sv.Text).First(); 

在我的情況下,在字典中的條目數變少。但是,有關詞典/列表較大時的性能考慮,請參見this question

7

看起來將字典保存到數據庫的通用正確方法就是它的枚舉方式,因爲表本質上是一個鬆散的訂單概念的集合 - 就像IEnumerable一樣。也就是說,一個字典被列舉爲IEnumerator的< KeyValuePair < TKEY的,TValue>中>等表應該有2列:

Key 
Value 

從那裏,你有複雜類型,現有EF公約,其中關鍵實際上可能成爲具有許多特性的對象,並且也是有價值的。例如用戶對象的字典可能看起來像:

Username (TKey) 
Address1 (TValue) 
Address2 (TValue) 

這是不幸這個廣義化是沒有內置到EF;應該提出。

您可以使用生成KeyValuePair的數據註釋版本的廣義類,而不是爲解決方案開發特定類型。

public class EFKeyValuePair<TKey, TValue> 
{ 
    [Key] 
    public TKey Key { get; set; } 
    public TValue Value { get; set; } 
} 

我不能確定你如何確保表名會以邏輯和可覈查的方式寫出然而沒有繼承這個類,並添加到每個子類的屬性。也許流利的API可以讓你最後一步(我不太熟悉)。