在实体框架代码优先中建模本地化数据

Kas*_*sem 3 .net c# entity-framework localization

我正在尝试创建一个支持本地化的域模型。我查看了之前提出的一些问题,但我不太喜欢所提出的解决方案。例如,在这个问题中,我认为为每个应该支持本地化数据的实体创建一个额外的实体是多余的。我宁愿将所有实体的本地化数据放在一个实体中,其唯一目的是保存本地化数据。

我建议的解决方案如下:

  1. 创建一个LocalizedEntity类,所有应支持本地化的实体都将从该类继承。

  2. 创建一个LocalizedData基本上保留实际本地化文化价值观的实体。

更新:

public class LocalizedEntity
{
    public String Code { get; set; }
}

public enum ResourceType
{
    CityName,
    CityDescription,
    StreetName,
    AreaName
    //others...
}

public class LocalizedData
{
    public Int32 Id { get; set; }
    public String Code { get; set; }
    public ResourceType Type { get; set; }
    public Int32 CultureId { get; set; }
    public String Value { get; set; }
}

public class City : LocalizedEntity
{
    public Int32 Id { get; set; }
    public virtual ICollection<Area> Areas { get; set; }
    //others
}
Run Code Online (Sandbox Code Playgroud)

相应地,业务层将获取本地化实体,然后LocalizedData通过Code和去从实体中获取其本地化值ResourceType。当然,为了避免多次往返数据库,一些缓存可能是合适的。

你的想法?

Ser*_*sev 5

您正在建模的是 EAV(实体-属性-值)存储。很快你的“资源类型”枚举就会溢出到无法管理的状态。雪上加霜的是,这在数据库结构方面非常无效。

如果您希望本地化在数据库使用和代码可读性方面仍然可维护,那么您应该本地化实体,而不是属性,这意味着数据库中的每一行都应该保存该语言的实体 ID、语言 ID 和数据。