2011-01-14 9 views
2

NHibernateマッピングからデータベースを構築しようとしていて、問題が発生しました。ローカライズのための流暢なNHibernateマッピング

私は、ローカライズされた文字列値を持つ多くのクラスがあります。

public class MyClass1 { 
    public virtual int Id { get; set; } 
    public virtual ShortString Name { get; set; } 
    public virtual LongString Description { get; set; } 
} 

public class MyClass2 { 
    public virtual int Id { get; set; } 
    public virtual ShortString Name { get; set; } 
    public virtual LongString Description { get; set; } 
} 

や言語などの

public class Language { 
    public virtual string Code { get; set } 
    public virtual string Name { get; set } 
} 

私のShortStringとのLongStringクラスを両方とも同じに見える:

public class ShortString { 
    public virtual int Id { get; set; } 
    public virtual IDictionary<Language, string> Values { get; set; } 
} 

は、私が欲しいもの達成するためには、このような2つのテーブル(ShortStringとLongString)があります:

TABLE ShortString 
----------------- 
Id (int) 
LanguageCode (nvarchar(8)) 
Value (nvarchar(256)) (or ntext for the LongString Table) 

... IdとLanguageCodeを主キーとして、ForeignKeyを言語表に使用します。

MyClass1とMyClass2の表では、NameId(int)列とDescriptionId(int)列をそれぞれShortStringとLongStringの表にマップする必要があります。

私は完全に固執しています。どうすればこれを達成できますか?

答えて

0

たぶん、あなたは

に完全
public class MyClass1 { 
    public virtual int Id { get; set; } 
    public virtual IDictionary<Language, string> Name { get; set; } 
    public virtual IDictionary<Language, string> Description { get; set; } 
} 

public class MyClass2 { 
    public virtual int Id { get; set; } 
    public virtual IDictionary<Language, string> Name { get; set; } 
    public virtual IDictionary<Language, string> Description { get; set; } 
} 

を短くし、長い文字列を捨てるとfollingマッピング

public class MyClass1Map : ClassMap<MyClass1> 
{ 
    public MyClass1Map() 
    { 
     [...] 
     HasMany(mc => mc.Name) 
      .Table("ShortString") 
      .KeyColumn("id") 
      .AsEntityMap("language_id") 
      .Element("value") 
     HasMany(mc => mc.Description) 
      .Table("LongString") 
      .KeyColumn("id") 
      .AsEntityMap("language_id") 
      .Element("value", e => e.Length(1000)) 
    } 
} 

を使用することができますnessesary

が微調整される可能性がありますので、私は今それをテストカント
関連する問題