2017-08-08 94 views
0

我想實現一個使用json將本地化字符串存儲在數據庫中使用實體框架的本地化邏輯,但是我需要幫助完成該對象。獲取在對象中聲明屬性的名稱

這裏是我的局部領域

[ComplexType] 
    public class MultiLanguageField : Dictionary<string, string> 
    { 
     public void AddRange(Dictionary<string, string> collection) 
     { 
      foreach (var item in collection) 
      { 
       this.Add(item.Key, item.Value); 
      } 
     }  

     [Column("Name")] 
     public string Serialized 
     { 
      get { return JsonConvert.SerializeObject(this); } 
      private set 
      { 
       if(string.IsNullOrEmpty(value)) 
       { 
        Clear(); 
        return; 
       } 

       var items = JsonConvert.DeserializeObject<MultiLanguageField>(value); 
       Clear(); 
       AddRange(items); 
      } 
     } 
    } 

然後,我只是申報財產在這樣一個對象。

public MultiLanguageField LocalizedField { get; set; } 

我希望能夠在序列化方法來代替列屬性,這樣的數據庫字段需要申報財產的名稱(LocalizedField在這種情況下)。

我看着反射,但無法設法得到聲明屬性的名稱。

任何幫助表示讚賞。 如果您知道使用Entity Framework管理數據庫本地化的更好方法,歡迎您的意見!

THX

編輯

我會盡力澄清。默認情況下,數據庫中列的名稱將爲LocalizedField_Serialized(PropertyNameOnParent_PropertyNameOnComplexType)。

如何告訴實體框架只採用PropertyNameOnParent而不是追加「序列化」屬性。

這看起來像一個開始。我稍後再看。

Entity Framework complex type's columns naming convention

回答

0

我實際上是在尋找(不知道它)是覆蓋默認命名約定的方式。

我結束了使用this solution

通過加入公約的模型構建器,我能改寫這是給這樣的序列化屬性的名稱。

class MultiLanguageStringNamingConvention : IStoreModelConvention<EdmProperty> 
    { 
     public void Apply(EdmProperty property, DbModel model) 
     { 
      string propertyName = string.Format("_{0}", nameof(MultiLanguageString.MultiLanguageString_Serialized)); 
      if (property.TypeName.ToLower() == "nvarchar(max)" && property.Name.EndsWith(propertyName)) 
      { 
       property.Name = property.Name.Replace(propertyName, ""); 
      } 
     } 
    } 

然後將其添加到模型構建器。

modelBuilder.Conventions.Add(new MultiLanguageStringNamingConvention()); 

最後,這種解決方案給我「LocalizedField」一欄的名字我一直在尋找在首位。

這使我可以將MultiLanguageString用於任何本地化字段。它以數據庫中的json字符串結尾,非常易於使用。

public class Movie 
{ 
    public MultiLanguageString Title { get; set; } 
} 

var movie = new Movie 
{ 
    Title = new MultiLanguageString 
    { 
     { "en-CA", "Eternal Sunshine of the Spotless Mind" }, 
     { "fr-CA", "Du soleil plein la tête" } 
    } 
}; 

var englishTitle = movie.Title["en-CA"];