【问题标题】:SubSonic 3 ActiveRecord Issues - Blank DataSubSonic 3 ActiveRecord 问题 - 空白数据
【发布时间】:2009-08-24 20:54:00
【问题描述】:

当我检查我的一个业务实体的 .Columns 属性时,我缺少 Table 和 PropertyName 的值。我从 Take(5) 之类的东西中得到了正确的记录数,但所有 5 个对象都将充满空字符串和 0 个值。

刚刚尝试了另一个 SQL 连接和同样的事情?我应该从哪里着手解决这个问题?

附加信息和代码:

// Replacing the CleanUp function seems to be cause
// What am I doing here that is not allowed?
// I'm dealing with Table names like USER_DETAILS and would prefer UserDetail  
// rename standard CleanUp to CleanUp2 then paste this into Settings.ttinclude
string CleanUp(string tableName)
{
    string res = tableName;
    //capitalization
    char[] ca = res.ToLower().ToCharArray();
    for (int i = 0; i < ca.Length; i++) {
      if ((i == 0) || (ca[i - 1] == '_')) {
            ca[i] = char.ToUpper(ca[i]);
      }         
    }
    res = new string(ca);
    //strip underlines
    res = res.Replace("_","");
    //strip blanks
    res = res.Replace(" ","");
    return res;
}  

已解决(有点): 看起来是删除下划线导致一切都向南。 Rob,这有可能在以后的版本中起作用吗?如果您能在源代码中指出正确的方向,我将很乐意提供帮助。

【问题讨论】:

  • 是否是 ActiveRecord.tt 中的第 353 行导致问题 - var col=tbl.Columns.SingleOrDefault(x=>x.Name=="" );
  • 如果您愿意提供帮助(这将是很棒的!),您可以前往 GitHub 并 fork 模板项目(您需要了解/喜欢 Git -blog.wekeroad.com/subsonic/subsonic-working-with-git)进行修复,然后推动。观看上面的视频 - 它解释了如何......
  • 其实我可能需要一点帮助。当我单步执行代码时,它会变得非常混乱。我有一个名为 Active 的属性,它映射到数据库字段 ACTIVE,调用了 Active 的 set{}。我有一个名为 FirstName 的属性,它与数据库字段 FIRST_NAME 相关,FirstName set{} 永远不会被调用。这是某种反思吗?

标签: .net activerecord subsonic subsonic3


【解决方案1】:

如果您可以为您的一个表发布您的 CREATE sql - 这将是一种入门方式。另外 - 确保你有主键等。

【讨论】:

  • 我确实有主键。不确定 CREATE sql 是什么意思。创建表的DDL语句?我将它用于旧数据库,其中表结构几乎不会改变。找到您正在寻找的 CREATE sql 的最佳方法是什么?循环通过 .Columns 属性?
  • 如果您使用的是 sql server management studio,您只需右键单击该表并选择“将表编写为”->“CREATE TO”->“新建查询窗口”
  • 但我正在使用预先存在的数据库。在这种情况下,您需要做些什么特别的事情才能启动和运行?
  • 好的。我不知道我改变了什么,但现在它在两个数据库上都可以工作。我完全感到困惑。
  • 哦等等...我可以重新创建它。如果我修改我的清理功能,我可以重现。我会将其发布到问题中。
【解决方案2】:

请注意,我认为这与我上周遇到的 issue #107 相同。 http://github.com/subsonic/SubSonic-3.0/issues#issue/107

【讨论】:

  • +1 你对此有深入研究吗?今天我在杂草中迷失了代码,但我想我把它追踪到了一些 Load() 方法。我还没有过去。这需要进一步研究吗?就像我在其他 cmets 中所说的那样,我愿意提供帮助。但我现在只进入 SubSonic 大概 4 周。对内部结构还不太了解。
  • 我可能会离开这里:但问题是由于 SubSonic.Core 项目中 database.cs 文件的 155 和 156 中的假设造成的吗?我会在 github 上发布这个问题。
  • 那是我最初挖掘的地方。对象从该数据读取器加载其列,但在某处它试图将原始列名映射到修改后的属性名,而不是将原始列名映射到原始列名。
【解决方案3】:

我刚刚在我的 SubSonic3 模板中应用了您的 CleanUp 功能。它工作得很好。但在此之前,我在 Subsonic Core 中制作了一些补丁来在 Subsonic 对象和表格列之间进行通信。

  • 首先,我尝试收集将被投影的列(ExecutionBuilder.cs - 第 217 行),然后将其添加到字符串列表中
  • 将该列表传递给 QueryCommand 以便 QueryCommand 对象知道哪个 将被投影的列(ExecutionBuilder.cs - 第 233 行)
  • 在 DbQueryProvider.cs(第 297 行)中进行一些修改,以便 DataReader 将传递列名列表
  • 最后,DataReader 将根据之前传递的字符串列表中的顺序从数据库中插入值(Database.cs 第 158 行)

您可以在here 中查看我在做什么的详细信息。

【讨论】:

    【解决方案4】:

    在运行完代码库后,我想我找到了一个更简单的解决方案(恕我直言)。

    IColumn 接口定义了一个“PropertyName”属性,我认为该属性旨在指示表类上表示该列的属性的名称(类似于 ITable 上的“ClassName”属性)。在 Structs.tt 模板中,这没有设置,所以我将它(大约第 39 行)设置为列 CleanName 属性的值。

    这将允许 DatabaseTable.cs(大约第 110 行)中的 GetColumnByPropertyName 方法使用 PropertyName 而不是使用 Name。

    我已将 Name 属性添加到 IColumn 接口,因为它似乎是一个疏忽,这意味着可以修改 Load 扩展方法(Database.cs 大约第 143 行)以访问传入的 Columns 属性对象(如果它是 IActiveRecord 的派生对象)并使用它将“名称”映射到“属性名称”。

    如果我有时间弄清楚我们的 GitHub,我会提交更改。

    干杯

    加里

    【讨论】:

    • 酷。我认为自从我最初发布以来,其他人已经看过这个。您可能想查看有关此的其他信息。如果不是 GitHub,也许您可​​以通过电子邮件向他们发送要添加的代码。 (我敢肯定人们讨厌那个......)
    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多