Nhibernate Map By Code を使用して Dictionary をマッピングする際に問題が発生しています。クラスを多言語化しようとしています。そのために、LanguageCodeごとに適切な_i18n LanguageClassを安全にする辞書を作成しました。
マッピングは機能しているように見えましたが、言語辞書を使用して製品を取得したい場合、それは常に null であり、その理由がわかりません。
これが私のコードです:
public class Product
{
public virtual String ArticleNumber { get; set; }
public virtual Dictionary<String, Product_i18n> Languages { get; set; }
}
public class Product_i18n
{
public virtual long Id { get; set; }
public virtual Product Product { get; set; }
public virtual String LanguageCode { get; set; }
public virtual String Name { get; set; }
}
マッピングは次のとおりです。
class ProductMap : ClassMapping<Product>
{
public ProductMap()
{
Lazy(true);
// Sets Tablename
Table("Prodcut");
// primary key
Id(product => product.ArticleNumber, mapping =>
{
mapping.Column("ArticleNumber");
mapping.Generator(Generators.Native);
});
Map<string, Product_i18n>(
product => product.Languages,
mapping =>
{
},
mapkey =>
{
mapkey.Element(k =>
{
k.Column("LanguageCode");
});
},
mapvalue =>
{
mapvalue.OneToMany();
});
}
}
class Product_i18n_Map : ClassMapping<Product_i18n>
{
public Product_i18n_Map()
{
/*ComposedId(mapper =>
{
mapper.Property(n => n.Product);
mapper.Property(n => n.LanguageCode);
});
* */
Table("Product_i18n");
Id(n => n.Id, mapper =>
{
mapper.Column("Product_i18nId");
mapper.Generator(Generators.Native);
});
Property(n => n.LanguageCode, mapping =>
{
mapping.Column("LanguageCode");
});
ManyToOne(n => n.Product, mapping =>
{
mapping.Column("Product");
});
Property(n => n.Name);
}
}
そして、それが情報を取得するための私の主な機能です:
Configuration config = new Configuration();
config.SessionFactory().GenerateStatistics();
config.DataBaseIntegration(Configure);
ModelMapper mapper = new ModelMapper();
mapper.AddMapping<Product_i18n_Map>();
mapper.AddMapping<ProductMap>();
config.AddMapping(mapper.CompileMappingForAllExplicitlyAddedEntities());
var lines = config.GenerateSchemaCreationScript(new MsSql2008Dialect());
foreach (var curLine in lines)
Console.WriteLine(curLine);
Console.WriteLine(Thread.CurrentThread.CurrentUICulture.IetfLanguageTag);
ISessionFactory factory = config.BuildSessionFactory();
using (ISession session = factory.OpenSession())
{
Product p1 = new Product() { ArticleNumber = "4711" };
session.Save(p1);
Product_i18n p1ger = new Product_i18n() { LanguageCode = "de-DE", Name = "Playstation", Product = p1 };
Product_i18n p1jap = new Product_i18n() { LanguageCode = "JP", Name = "プレイステーション", Product = p1 };
session.Save(p1ger);
session.Save(p1jap);
var query = session.QueryOver<Product>().List();
var query2 = session.QueryOver<Product_i18n>().List();
session.Close();
}