【问题标题】:Why does Fluent NHibernate create ALWAYS a Text field from a C# String property as DEFAULT?为什么 Fluent NHibernate 总是从 C# 字符串属性创建一个文本字段作为默认值?
【发布时间】:2011-01-08 18:43:51
【问题描述】:

我在这里运行这个示例:https://github.com/jagregory/fluent-nhibernate/blob/master/src/Examples.FirstProject/Program.cs

String 类型的所有 C# 属性都映射到 TEXT sql 字段而不是

nvarchar 或 varchar,除了它是默认设置。

我该如何改变呢?

我知道我可以做到:

Map(x => x.Name).CustomSqlType("nvarchar").Length(50); // does not work !!!
Map(x => x.Name).CustomSqlType("nvarchar (50)"); // does work !!!

但我不想更改每个字段...

更新:...因此我可以通过 =>

进行自定义约定

我要做的是编写一个自定义的 Convention 类,例如:

public class ColumnStringToNVarCharConvention : IPropertyConvention, IPropertyConventionAcceptance
    {
        public void Apply(IPropertyInstance instance)
        {
            instance.CustomSqlType("nvarchar");
        }

        public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
        {
            criteria.Expect(x => x.Property.GetType().Equals(typeof(string)));
        }
    }

有人可以正确上述代码吗?我测试了它,但它无论如何都不起作用......

【问题讨论】:

  • 如果它没有默认为TextNVARCHAR(MAX),会不会更令人困惑?毕竟,选择作为默认值的任何长度都是任意的,然后您的问题可能是“为什么 NH 选择长度 x 作为 NVARCHAR 字段的默认值?”
  • 主要部分 > 90% 的数据库字符串字段是 varchar 或 nvarchar 而不是无法索引的 TEXT。那么为什么不提供 varchar/nvarchar 作为 DEFAULT 呢?
  • 我必须手动将我的字段设置从 TEXT 编辑为 Varchar,因为平均 10% 的字段被用作 TEXT ?没有意义。为什么不将 90% 设为默认值?逻辑嗯?
  • Funny... 这个人在 6 个月前遇到了 OPOSITE 问题:stackoverflow.com/questions/3105391/… 他得到了 DEFAULT NVARCHAR 并想要文本大声笑???
  • 您在配置中使用与数据库相同的方言吗?

标签: string sqlite text fluent-nhibernate convention


【解决方案1】:

您使用的是 SQLite,对吗?这就是你的问题所在。在this answer to another post 中有更好的描述,但是 SQLite 没有与其他数据库相同的数据类型。这不是 Fluent NHibernate 的问题,而是 NHibernate 处理几乎没有数据类型的数据库的方式。

对于更严格的数据库,Fluent NHibernate 默认使用更合理的数据类型。它因数据库而异,但对于字符串,它将是 nvarchar

【讨论】:

  • 我已经阅读了 James 关于 sqlite 数据类型的文章。我知道日期是一个字符串,但我根本不知道多年来只有 5 种数据类型使用 sqlite IDe 来显示类似 varchar、nvarchar 哈哈
  • 所以我的 IDE 显示 nvarchar、varchar 等的唯一原因是 IDE 对从 T-SQL、MySQL 迁移到 sqlite 的人们来说是一种友好的方式,因为他们习惯了这种数据类型。詹姆斯你会改变我的 ColumnStringToNVarCharConvention 课程吗?
【解决方案2】:

您可以尝试检查您要连接的数据库的兼容性级别。如果它设置得太低(80),它可能默认为文本,因为 NTEXT 直到 SQL2005 才被弃用,兼容级别为 90。这不是保证,只是一种可能的想法。

这是用于检查兼容性级别的 MSDN 说明...

查看或更改兼容性 数据库级别

连接到相应的 SQL Server 数据库实例 引擎,在对象资源管理器中,单击 服务器名称以展开服务器树。

扩展数据库,并且取决于 数据库,要么选择一个用户 数据库或扩展系统数据库 并选择一个系统数据库。

右键单击数据库,然后 点击属性。

数据库属性对话框 打开。

在“选择页面”窗格中,单击 选项。

当前的兼容级别是 显示在兼容性级别 列表框。

要更改兼容级别, 从 列表。选择是 SQL Server 2000 (80)、SQL Server 2005 (90) 或 SQL 服务器 2008 (100)。

使用 SQLite,只有 5 种数据类型,一种是字符串。

http://www.sqlite.org/c3ref/c_blob.html

SQLite 中的每个值都有五个之一 基本数据类型:

64 位有符号整数
64 位 IEEE 浮点数
字符串
BLOB

这些常量是每个 那些类型。

请注意,SQLITE_TEXT 常量是 也用于 SQLite 版本 2 完全不同的意思。软件 链接到两个 SQLite 版本 2 和 SQLite 版本 3 应该使用 SQLITE3_TEXT,而不是 SQLITE_TEXT。

【讨论】:

  • 在我上面的答案中添加了更多信息。您还可以在原始问题中添加 SQLite 标签,以便让更了解它的人参与进来。
  • 我用流利的 nhibernate 重新标记,因为我确定它是一个流利的问题,与数据库无关。我又更新了我的问题!
  • 这不是fluent的问题,NHibernate是这样处理SQLite的。
  • @James 好吧,你打败了我 ;-)
猜你喜欢
  • 2016-01-17
  • 1970-01-01
  • 2011-08-05
  • 2012-11-28
  • 2012-12-29
  • 2012-12-01
  • 2011-08-25
  • 1970-01-01
  • 2016-06-04
相关资源
最近更新 更多