2017-08-08 3 views
0

J'essaie d'implémenter une logique de localisation en utilisant json pour stocker la chaîne localisée dans la base de données en utilisant Entity Framework, mais j'ai besoin d'aide pour compléter l'objet.Récupère le nom de la propriété déclarante dans l'objet

Voici mon champ localisé

[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); 
      } 
     } 
    } 

Je déclare simplement la propriété dans un objet comme celui-ci.

public MultiLanguageField LocalizedField { get; set; } 

Je veux être en mesure de remplacer l'attribut de colonne sur la méthode sérialisé de sorte que le champ de base de données prend le nom de la propriété déclarant (LocalizedField dans ce cas).

J'ai regardé la réflexion, mais je n'arrive pas à obtenir le nom de la propriété déclarante.

Toute aide appréciée. Si vous connaissez un meilleur moyen de gérer la localisation dans une base de données avec Entity Framework, je vous encourage à entrer vos commentaires!

Thx

EDIT

Je vais essayer de préciser. Par défaut, le nom de la colonne dans la base de données serait LocalizedField_Serialized (PropertyNameOnParent_PropertyNameOnComplexType).

Comment puis-je dire à Entity Framework de ne prendre que PropertyNameOnParent au lieu d'ajouter la propriété "Serialized".

Cela ressemble à un début. Je le regarderai plus tard.

Entity Framework complex type's columns naming convention

Répondre

0

Ce que je cherchais en fait pour (sans le savoir) était un moyen de passer outre la convention de nommage par défaut.

Je fini par utiliser this solution

En ajoutant une convention au Modelbuilder, j'ai pu remplacer le nom qui a été donné à la propriété sérialisé comme celui-ci.

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, ""); 
      } 
     } 
    } 

Ensuite, vous ajoutez à la Modelbuilder.

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

En fin de compte, cette solution me donne le nom de colonne « LocalizedField » Je cherchais en premier lieu.

Cela me permet d'utiliser MultiLanguageString pour n'importe quel champ localisé. Il finit comme une chaîne JSON dans la base de données et est assez facile à utiliser.

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"];