有关流畅的 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)中 protected 关键字。 因此架构导出失败,并出现“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 使用什么) 啊啊?!?
还存在另一个问题: 对于每个未用引号括起来的表和列,PostGre 会将表/列名称更改为小写,这是“很好”(但只是因为它不区分大小写),但如果名称用引号括起来,它变得区分大小写...
然后,我确实有大约 200 个 View 需要移植...... 我实际上不想编写一个解析器,只是为了将每个 View 的每一列(以及表和 View 名称)包含在任何数据库使用的任何引号中...
有没有办法告诉 Fluent/nHibernate 为我转义表和列名称(总是,但最好仅在必要时)?
有趣的是,我自己的数据库实际上并不是问题(我在所有 200 个表中都添加了 T_ 前缀,每一列都添加了某个表 id),问题在于所有那些蹩脚的第三方组件(例如 ELMAH 或 Session)/成员(member)提供商等),这些内容是由...[ self 审查]的人编写的
最佳答案
也许您没有设置属性hbm2ddl.keywords
(默认应该打开)。
尝试查看this post来自法比奥·毛洛。
关于c# - FluentNhibernate和表/列名大写字母的保存和转义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9748237/