有关流畅的nHibernate表映射的问题:
显然我的错误印象是,使用ORM工具,例如nHibernate,可以获得数据库独立性 - 至少在表创建中。
现在,我有一个自动工具(http://nmg.codeplex.com),它为我创建了流畅的nHibernate映射。 它也可以正常工作(尽管只有所有表都有主键...)
这是由程序
创建的这种映射的一个很好的代表性示例public class ELMAH_ErrorMap : ClassMap<ELMAH_Error>
{
public ELMAH_ErrorMap()
{
Table("ELMAH_Error");
LazyLoad();
Id(x => x.ErrorId).GeneratedBy.Assigned().Column("ErrorId");
Map(x => x.Application).Column("Application").Not.Nullable().Length(60);
Map(x => x.Host).Column("Host").Not.Nullable().Length(50);
Map(x => x.Type).Column("Type").Not.Nullable().Length(100);
Map(x => x.Source).Column("Source").Not.Nullable().Length(60);
Map(x => x.Message).Column("Message").Not.Nullable().Length(500);
Map(x => x.User).Column("User").Not.Nullable().Length(50);
Map(x => x.StatusCode).Column("StatusCode").Not.Nullable();
Map(x => x.TimeUtc).Column("TimeUtc").Not.Nullable();
Map(x => x.Sequence).Column("Sequence").Not.Nullable();
Map(x => x.AllXml).Column("AllXml").Not.Nullable().Length(1073741823);
}
}
显然,问题#1就是这一行
Map(x => x.User).Column("User").Not.Nullable().Length(50);
因为user是MS-SQL中的受保护关键字(以及postgre)。 因此,架构导出失败,“User”附近出现语法错误。
现在,显然可以通过将列(或表)名称包含在相应的转义字符中来解决(MS-SQL为[],“PostGreSQL”为
)所以我改变了
Map(x => x.User).Column("User").Not.Nullable().Length(50);
到
Map(x => x.User).Column("[User]").Not.Nullable().Length(50);
它工作正常。
然后在PostGre上,我不得不改变
Map(x => x.User).Column("[User]").Not.Nullable().Length(50);
到
Map(x => x.User).Column("\"User\"").Not.Nullable().Length(50);
因为postgre使用了另一个转义序列......
现在,我是否必须为每个数据库系统创建一个单独的映射? (MySQL还有另一个转义字符......,想知道FireBird使用了什么) ARGH?!?
还存在另一个问题: 对于每张桌子和PostGre没有在引号中引用的列,将表/列名更改为小写,这是“罚款”(但仅因为它不区分大小写),但如果名称用引号括起来,则会成为大小写 - 敏感......
然后,我确实有200个端口视图... 我实际上并不想写一个解析器只是为了将每个视图的每一列(以及表和视图名称)都包含在任何数据库所使用的引号中......
有没有办法告诉fluent / nHibernate逃脱桌面&amp;我的列名(总是,但最好只在必要时)?
有趣的是,我自己的数据库实际上并不是问题(我的所有200个表都带有T_前缀,每个列都带有一些表ID),问题是那些糟糕的第三方组件(如ELMAH或Session) /会员提供者等),由...... [自我审查]
的人撰写