在使用SubSonic ActiveRecord插入新行后,没有从Identity列获取键值

时间:2010-05-21 16:28:25

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

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

TIA

...更新......

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

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

任何帮助表示赞赏!

- BUMP -

3 个答案:

答案 0 :(得分:0)

对你问题的第一部分不能帮助你。可能你应该为此创建一个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。

答案 1 :(得分:0)

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

Account account = new Account();
account.EmailAddress = emailAddress;
account.Identity = identifier;
account.IsActive = true;
account.Save();

int accountId = account.AccountId; // AccountId being an identity column.

在这个例子中没有错误处理,但你得到了我的漂移。

答案 2 :(得分:0)

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

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