我正在尝试使用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;属性。
这看起来像一个开始。我稍后会看。
答案 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"];