【问题标题】:Not getting key value from Identity column back after inserting new row with SubSonic ActiveRecord使用 SubSonic ActiveRecord 插入新行后未从 Identity 列返回键值
【发布时间】:2011-02-22 10:49:02
【问题描述】:

我确定我在这里错过了明显的答案,但可以使用手。我是 SubSonic 的新手并使用版本 3。我已经到了能够查询和插入的地步,但我坚持在插入后如何获取标识列的值。我看到另一篇提到 Linq 模板的帖子。我没有使用那些(至少我不认为我是......?)

TIA

...更新...

所以我一直在调试我的代码,观察 SubSonic 代码是如何工作的,我发现了 indentity 列被忽略的位置。我使用 int 作为数据库中我的 ID 列的数据类型,并将它们设置为标识。由于 int 在 c# 中是不可为空的数据类型,因此通过执行 (key==null) 检查键列中是否存在值的 Add 方法 (public void Add(IDataProvider provider)) 中的逻辑测试可能是问题。获取标识字段新值的代码位于“真实路径”中,因为 int 不能为空,并且我使用 int 作为标识列数据类型,此测试永远不会通过。我的对象的 ID 字段中有一个我没有放在那里的 0。我假设它是在对象初始化期间设置的。我在这儿不准吗?是改变我在数据库中的数据类型的答案吗?

另一个问题(更多的是好奇)。我注意到生成的类中的一些属性是用 ?在数据类型之后。我不熟悉这个声明结构......给出了什么?有一些声明为 int(非关键字段),还有一些声明为 int? (关键领域)。这与他们在初始化时的处理方式有关吗?

感谢任何帮助!

--颠簸--

【问题讨论】:

    标签: subsonic3 subsonic-active-record identity-column


    【解决方案1】:

    除了我之前的回答;整数值不能为空。它是一个整数,因为数据库列是主键,因此根据定义它不应为空。不可为空的整数的默认值为 0See default Values in C#

    Mamoo 对可空类型的引用也值得参考。因此,您的单元测试应该针对 0 测试失败或大于 0 测试通过。

    【讨论】:

    • 感谢 Junto,我遇到的问题是用于确定记录是否为新记录以及是否需要生成新密钥的逻辑。如果您转到任何生成的类并找到带有此签名的 Add 方法 - public void Add(IDataProvider provider) - 并按照那里的逻辑,您将看到它检索类的键值,将其与 null 和如果是(这永远不会发生,因为它是一个不可为空的 int),它会为记录生成一个新的键值。如果不是,它保持 0 值并在插入时失败。我确定我有最新的版本,我错过了什么吗?
    • 是否可能支持非整数主键?字符串的默认值为空。我的身材和你一样,我明白你的意思。在整数的情况下,键永远不会为空: var key=KeyValue(); if(key==null){ var newKey=_repo.Add(this,provider); this.SetKeyValue(newKey); }else{ _repo.Add(this,provider); }
    • 顺便说一句,我今天遇到了类似的问题(即插入失败)。我意识到我忘记在我的一张表的主键列上设置身份插入。即使在我重新运行自定义工具之后,更改也没有被拾取。在关闭并重新打开解决方案之前,我必须删除所有生成的 Subsonic 代码和模板。将模板复制回解决方案后,身份插入开始工作。
    【解决方案2】:

    这对我有用,我使用完全相同的设置:

    Account account = new Account();
    account.EmailAddress = emailAddress;
    account.Identity = identifier;
    account.IsActive = true;
    account.Save();
    
    int accountId = account.AccountId; // AccountId being an identity column.
    

    在这个例子中没有错误处理,但你明白我的意思。

    【讨论】:

    • 我同意我正在做的事情应该可以工作,但是当它在 add 方法( if(key==null) )中遇到这一行时,它会检查键值是否为空,关键变量始终为0,无论是否为新记录。
    【解决方案3】:

    对您问题的第一部分没有太多帮助。可能您应该为此创建一个 T4 模板,如下所述:

    How Can I Get the Identity Column Value Associated with a SubSonic 3 LinqTemplate Insert?

    “?”您在 int 声明后发现的指的是可空类型:

    http://msdn.microsoft.com/en-en/library/1t3y8s4s(VS.80).aspx

    基本上就是说属性可以为null。

    【讨论】:

      猜你喜欢
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      • 2018-04-18
      • 2011-01-17
      • 2011-07-18
      • 1970-01-01
      • 1970-01-01
      • 2021-09-23
      相关资源
      最近更新 更多