我有一个带有标识列的表。
将 Massive 与这样的代码一起使用
var table = new Categories();
var newID = table.Insert(new {CategoryName = "Buck Fify Stuff", Description = "Things I like"});
然后
table.Scalar("select scope_identity()");
返回 DBNull :(
我需要做些什么来获得实际插入的身份值
MSDN 文档指出SCOPE_IDENTITY:
“检索当前会话中任何表中生成的最后一个标识值”
查看大量源代码,似乎每次调用都会Scalar()
打开一个新连接:
/// <summary>
/// Returns a single result
/// </summary>
public virtual object Scalar(string sql, params object[] args) {
object result = null;
using (var conn = OpenConnection()) { // <-- see this ...
result = CreateCommand(sql, conn, args).ExecuteScalar();
}
return result;
}
...
/// <summary>
/// Returns and OpenConnection
/// </summary>
public virtual DbConnection OpenConnection() {
var result = _factory.CreateConnection();
result.ConnectionString = ConnectionString;
result.Open(); // <-- ...and this
return result;
}
因此,每次您table.Scalar("select scope_identity()");
执行此操作时,您实际上都是在一个新连接中执行此操作(这意味着不同的会话/范围)。
这解释了DBNull
结果。
但既然你已经在做:
var newID = table.Insert(...)
您可能想newID
在插入发生后检查 的值;我希望你能在那里找到一些不错的东西。
至少,这就是代码Insert()
让我相信的:
public virtual dynamic Insert(object o) {
var ex = o.ToExpando();
if (!IsValid(ex)) {
throw new InvalidOperationException("Can't insert: " + String.Join("; ", Errors.ToArray()));
}
if (BeforeSave(ex)) {
using (dynamic conn = OpenConnection()) {
var cmd = CreateInsertCommand(ex);
cmd.Connection = conn;
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT @@IDENTITY as newID";
ex.ID = cmd.ExecuteScalar();
Inserted(ex);
}
return ex;
} else {
return null;
}
}