【问题标题】:SimpleRepository Boolean mapping problemSimpleRepository 布尔映射问题
【发布时间】:2009-07-16 13:36:14
【问题描述】:

我正在使用 SubSonic (v3.0.0.3) 通过 SimpleRepository 到 SQLite 进行简单的对象映射。一切都适用于字符串、日期时间、Guid 和 int 类型的属性。当我尝试向对象添加布尔(或布尔)属性时,我可以将其添加到数据库中就好了,但是当我尝试检索它时,我收到以下错误消息:

“‘System.Byte’类型的对象无法转换为‘System.Boolean’类型。”

我尝试了几种不同的方式来检索数据。以下是一些示例(当相关对象没有任何 bool 属性时有效):

var myObjs = repo.All<MyObj>();

var myObjs = from m in repo.All<MyObj>()
    orderby m.Title
    select m;

我不确定这是一个错误,还是我做错了什么。是否有其他人能够使用 SimpleRepository 将此数据类型映射到 SQLite?

谢谢!
C

【问题讨论】:

  • 同样的问题。迁移将 bool 映射到 sqlite 类型“tinyint”,当您禁用迁移并将字段类型手动更改为 boolean 时:您会收到“'System.Int64' 类型的对象无法转换为'System.Int32'类型的参数异常'。”
  • 哎呀,这实际上是一个不同的问题。当 SQLite 想要“long”时,我的班级中的 ID 字段为 int

标签: subsonic


【解决方案1】:

为我自己修复了这个,不确定它是否是亚音速的错误,但挖掘了源代码以找到修复。

从github获取亚音速源码并打开

SubSonic-3.0\SubSonic.Core\SQLGeneration\Schema\SQLiteSchema.cs

   public override string GetNativeType(DbType dbType)
    {
        switch(dbType)
        {
            case DbType.Object:
            case DbType.AnsiString:
            case DbType.AnsiStringFixedLength:
            case DbType.String:
            case DbType.StringFixedLength:
                return "nvarchar";
            case DbType.Boolean:
                return "boolean"; // <-- This was set to "tinyint"
            case DbType.SByte:
            case DbType.Binary:
            case DbType.Byte:
                return "longblob";
            case DbType.Currency:
                return "money";

...

注意我评论的地方,Subsonic 现在将 .net DbType 映射到 SqlLite 类型“boolean”而不是“tinyint”。在发布模式下重建并获取新的 SubSonic.Core.dll 并替换它。

如果您不熟悉 git,我可以添加一些关于通过 cygwin 快速克隆的说明。如果你没有时间,我可以给你我现在正在使用的 dll,但是这是一个简单的更改,最好自己更改它,而不是从未知的地方获取已编译的 dll ;)

【讨论】:

  • 这确实解决了问题。看了代码,我猜这是官方的bug,所以我想我还是先提交吧。看起来 GitHub 中的源代码是 v3.0.0.2,所以无论如何我都希望将其合并到最新版本中。谢谢!!
  • 很高兴我能帮上忙,鉴于这解决了您的问题,您能否在方框中打勾? :)
  • 抱歉,第一次在本站发帖。再次感谢!
  • 这是一个错误 - 如果您有时间,请创建一个问题 - 我将不胜感激!
  • github.com/subsonic/SubSonic-3.0/issues#issue/61 Chrsitian 在这里记录了它。谢谢。
【解决方案2】:

我也遇到了这个问题并找到了问题。

在GetDbType()函数的SQLite.ttinclude中,没有定义布尔值。

只需将其添加到开关中

案例“布尔”:返回 DbType.Boolean;

它应该再次工作;D

【讨论】:

    【解决方案3】:
    猜你喜欢
    • 2014-01-16
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    相关资源
    最近更新 更多