1

我正在尝试设置 NHibernate 以根据我提供的女巫语言 ID 获取翻译。

我有一个看起来像这样的类:

public class Location
{
    public virtual Guid Id { get; set; }

    [Translate("Name")]
    public virtual string Name { get; set; }

    [Translate("Description")]
    public virtual string Description { get; set; }

    public virtual bool Popular { get; set; }
    public virtual bool Active { get; set; }
}

我的翻译属性如下所示:

[AttributeUsage(AttributeTargets.Property)]
public class TranslateAttribute : Attribute
{
    public readonly string DatabaseSuffix;

    public TranslateAttribute(string databaseSuffix)
    {
        DatabaseSuffix = databaseSuffix;
    }

    public string GetSuffix()
    {
        return DatabaseSuffix;
    }
}

我也有一件事知道我目前使用的是什么语言:

public interface ILanguageProvider
{
    void SetLanguage(string language);
    string GetCurrentLanguage();
}

我想使用约定设置 nhibernate,因此在获取具有具有 Translate-attribute 属性的任何内容时,它应该针对每个属性像这样查询我的 Translations-table(或者可能一次获取所有翻译):

SELECT TOP 1 Text 
FROM Translations 
WHERE Id = '{Id_From_my_Entity}_DataBaseSuffixFromTheTranslationAttribute' AND
      LanguageId = LanguageIdFromGetCurrentLanguageInTheImplentationOFILanguageProvider;

并将它返回的结果设置为它正在为其获取翻译的属性。

这可能吗?我该如何实现呢?

我正在使用 nHibernate 3.3.1.4000 和 Fluent NHibernate 1.3.0.733

4

1 回答 1

1

我不会神奇地做到这一点。

使用字典和提供当前名称的属性。这样做的好处是,如果更改了语言,所有对象都将具有可用的正确翻译。

public class MyClass1
{
    protected virtual IDictionary<string, string> Names { get; private set; }

    public virtual string Name { get { return Names[GetCurrentLanguageFromSomeWhere()]; } }
}


public class MyClass1Map : ClassMap<MyClass1>
{
    public MyClass1Map()
    {
        [...]
        HasMany(mc => mc.Names)
            .Table("Translations")
            .Where("property == 'Name'")
            .AsMap("language")
            .Element("text")
            .Not.LazyLoad();

        HasMany(mc => mc.Descriptions)
            .Table("Translations")
            .Where("property == 'Description'")
            .AsMap("language")
            .Element("text")
            .Not.LazyLoad();
    }
}

如果语言是静态的,则使用公式

Map(mc => mc.Name).Formula("... WHERE Language=" + GetCurrentLanguage());
于 2012-09-19T13:33:46.187 回答