我刚刚爱上了NHibernate和流畅的界面。后者支持非常好的映射和重构支持(不再需要xml文件)。
但是没有人是完美的,所以我错过了流利的多对多映射。有人知道它是否已经存在吗?如果是这样,一行简单的代码就会很好。
但是要坚持问题的标题,有没有办法将流畅和正常的NHibernate映射结合起来。
目前我使用以下行进行我的测试设置WITH Fluent,第二个代码块用于我的测试WITHOUT流畅(使用XML映射)。如何告诉流利者使用流利的IF AVAILABLE和XML否则......
var cfg = new Configuration();
cfg.AddProperties(MsSqlConfiguration.MsSql2005.ConnectionString.Is(_testConnectionstring).ToProperties());
cfg.AddMappingsFromAssembly(typeof(CatMap).Assembly);
new SchemaExport(cfg).Create(true, true);
var persistenceModel = new PersistenceModel();
persistenceModel.addMappingsFromAssembly(typeof(CatMap).Assembly);
IDictionary<string, string> properties = MsSqlConfiguration.MsSql2005.UseOuterJoin().ShowSql().ConnectionString.Is(_testConnectionstring).ToProperties();
properties.Add("command_timeout", "340");
session = new SessionSource(properties, persistenceModel).CreateSession();
没有流利......
config = new Configuration();
IDictionary props = new Hashtable();
props["connection.provider"] = "NHibernate.Connection.DriverConnectionProvider";
props["dialect"] = "NHibernate.Dialect.MsSql2005Dialect";
props["connection.driver_class"] = "NHibernate.Driver.SqlClientDriver";
props["connection.connection_string"] = "Server=localhost;initial catalog=Debug;Integrated Security=SSPI";
props["show_sql"] = "true";
foreach (DictionaryEntry de in props)
{
config.SetProperty(de.Key.ToString(), de.Value.ToString());
}
config.AddAssembly(typeof(CatMap).Assembly);
SchemaExport se = new SchemaExport(config);
se.Create(true, true);
factory = config.BuildSessionFactory();
session = factory.OpenSession();
就是这样...... 克里斯
PS:我真的很喜欢这个网站,GUI很完美,所有文章的质量都令人难以置信。我认为这将是巨大的:-)必须注册...答案 0 :(得分:2)
从Foo
到Baa
的映射:
HasManyToMany< Baa > ( x => Baas )
.AsBag ( ) //can also be .AsSet()
.WithTableName ( "foobar" )
.WithParentKeyColumn ( "fooId" )
.WithChildKeyColumn ( "barId" ) ;
查看ClassMapXmlCreationTester
中的示例 - 它们还会显示默认列名称。
答案 1 :(得分:2)
ManyToAny目前尚未实施(截至撰写时)。
关于流畅和不流畅映射的设置,你几乎就是第一个例子。
var cfg = MsSqlConfiguration.MsSql2005
.ConnectionString.Is(_testConnectionstring)
.ConfigureProperties(new Configuration());
cfg.AddMappingsFromAssembly(typeof(CatMap).Assembly); // loads hbm.xml files
var model = new PersistenceModel();
model.addMappingsFromAssembly(typeof(CatMap).Assembly); // loads fluent mappings
mode.Configure(cfg);
new SchemaExport(cfg).Create(true, true);
主要区别在于SchemaExport是最后一个。我假设您的第一个示例实际上是加载了流畅的映射,但它已经在那时创建了模式。
答案 2 :(得分:2)
你可以完全在Fluent NHibernate中完成你想做的事。
以下代码将使用Fluent NHibernate语法流畅地配置会话工厂,该工厂查找来自多个可能程序集的HBM(xml)映射文件,流畅映射和约定。
var _mappingAssemblies = new Assembly[] { typeof(CatMap).Assembly };
var _autoPersistenceModel = CreateAutoPersistenceModel();
Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString(_testConnectionstring))
.Mappings(m =>
{
foreach (var assembly in _mappingAssemblies)
{
m.HbmMappings.AddFromAssembly(assembly);
m.FluentMappings.AddFromAssembly(assembly)
.Conventions.AddAssembly(assembly);
}
m.AutoMappings.Add(_autoPersistenceModel );
})
.ExposeConfiguration(c => c.SetProperty("command_timeout", "340"))
.BuildSessionFactory();
您还可以使用许多其他选项:Fluent NHibernate Database Configuration