获取在对象中声明属性的名称

时间:2017-08-08 00:54:25

标签: c# entity-framework reflection localization

我正在尝试使用json实现本地化逻辑,以使用Entity Framework将本地化字符串存储在数据库中,但我需要帮助来完成该对象。

这是我的本地化领域

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

我希望能够通过Serialized方法替换Column属性,以便数据库字段采用声明属性的名称(在本例中为LocalizedField)。

我查看了反思,但无法获得声明属性的名称。

任何帮助表示赞赏。 如果您知道使用Entity Framework管理数据库本地化的更好方法,我欢迎您提供意见!

THX

修改

我试着澄清一下。默认情况下,数据库中列的名称为LocalizedField_Serialized(PropertyNameOnParent_PropertyNameOnComplexType)。

如何告诉Entity Framework只采用PropertyNameOnParent而不是附加&#34;序列化&#34;属性。

这看起来像一个开始。我稍后会看。

Entity Framework complex type's columns naming convention

1 个答案:

答案 0 :(得分:1)

我实际上在寻找(不知道)是一种覆盖默认命名约定的方法。

我最终使用this solution

通过向模型构建器添加一个约定,我能够像这样覆盖给予Serialized属性的名称。

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中。

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