因此,我和一位同事正在争论哪种方式更适合生成GUID的主键.
我们使用带有实体4的.NET 4.0并使用存储过程来进行选择/插入/更新.
他希望在代码中创建GUID主键,并使用Guid类或/和使用一些创建的Sequential GUID类将其作为插入的一部分传回.
我希望使用newid()或newsequentialid()在插入时由SQL Server创建GUID.
我反对他的方式的论点是,如果你必须进行多次插入,你必须进行往返以获得每个插入的guid,以便为外键约束维护该关系.另外,使用这种方式,您必须为每个插件进行几次往返.
他关于使用SQL做的论点是,在插入发生之前他无法访问密钥,并且必须等待插入才能使主键guid重新用于代码的其他部分.这样,您可以与存储过程建立一个连接,并处理所有插入.
那么,哪种方法更适合单个插入?哪种方法更适合事务中的多个插入?
我目前正在为Dapper编写包装器.此包装器强制每个查询都是存储过程.
在我的包装器中,我正在调用Dapper(带问题):
public IEnumerable<T> Select<T>(string storedProcName, dynamic param) {
IEnumerable<T> results;
using(var connection = new SqlConnection(_connectionString) {
results = connection.Query<T>(storedProcName, param, commandType: CommandType.StoredProcedure);
}
return results;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试将"param"传递给Query时,它告诉我"无法解析符号查询".当我删除param pass时,它工作正常.
任何人都可以指出我正确的方向,以便我可以将动态参数(或类似的东西)传递给Dapper吗?
我有一个具有以下枚举的模型:
class User < ApplicationRecord
enum user_type: [:api_user, :web_user]
end
Run Code Online (Sandbox Code Playgroud)
当它被保存到数据库中时,它会按预期使用整数值保存它.然后我有一个接受这样的枚举的函数(在控制器中):
do_something_useful(type: User.user_types[:web_user], user: user)
def do_something_useful(options)
some_enum_value = options[:type]
user = options[:user]
# Not a practical example. Just an example to demonstrate the issue.
# Should return Hello, User! You are a web_user type.
# But returns, Hello, User! You are a 1 type.
'Hello, #{user.name}! You are a #{some_enum_value} type.'
end
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是选项[:type]传递整数值.我想通过整数获取User.user_type的键值.这可能吗?
再次感谢.
这可能是一个非常简单的问题,但或多或少,我要求这样,我可以围绕数据访问块如何打开和关闭连接.
首先,我使用了类似企业库的东西大约10年,并在实体等之间来回切换.
无论如何,当我使用Database类的CreateDatabase()函数时,这是否会立即打开与数据库的连接,还是在我使用ExecuteReader之类的实际调用时打开连接?
它如何处理关闭连接?在DAL中使用连接后,我是否必须明确调用连接?在完成Reader等操作后,企业库如何确保连接已关闭?
此外,打开和关闭连接的最佳做法是什么?如果CreateDatabase立即打开连接?有一小部分代码可以分享吗?