1

私が提供する魔女のlanguageIdに応じて翻訳を取得するためにNHibernateをセットアップしようとしています。

次のようなクラスがあります。

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 属性を持つプロパティを持つものをフェッチするときは、プロパティごとに次のように翻訳テーブルに対してクエリを実行する必要があります (または、一度にすべての翻訳を取得する場合があります)。

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 に答える