c# - FluentNhibernate和表/列名大写字母的保存和转义?

标签 c# sql vb.net nhibernate fluent-nhibernate

有关流畅的 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/

相关文章:

c# - 获取 GeometryModel3D 的名称

c# - 在 SharpPCap 中如何找到设备的 IP 地址?

c# - 如何使用 LINQ 订购通过 .Include ("table"检索到的表?

mysql - 带有嵌入表的动态 SQL

c# - Excel 2016 在保存错误时触发撤消?

.net 可移植类库包含 Microsoft.VisualBasic 作为依赖项

c# - JQuery:在我添加数据的ajax jquery成功后丢失样式

php - 如何在 mysql 中编写这种查询?

mysql - 是否可以插入列表而不是字符串?

vb.net - 在 NLog 布局中包含回车换行符