我有一个带代码字段的实体。对于使用此实体的每个用户,用户插入的每个实体都必须具有代码。所以我编写的代码执行以下逻辑:
1.如果用户设置代码字段 - 然后使用他的代码
2.如果用户没有设置代码字段 - 从db读取下一个串行代码(从1开始,搜索下一个尚不存在的串行代码)并使用此代码。
问题是这样的情况:
假设用户能够通过单击鼠标添加两个实体
假设下一个串行代码应为“5”
在第一个实体中,用户设置代码= 5,在第二个实体中,用户不设置代码
因为我正在使用实体框架,并且在逻辑结束时有一个提交/保存更改,我插入第一个实体(代码为5的实体)和第二个实体,在db中搜索下一个下一个序列代码那还不存在。数据库中尚不存在的下一个序列代码是“5”。所以我将第二个实体设置为代码“5”
最终我想出了两个代码= 5的实体,这是错误的。
我想到了解决问题的方法
一种方法是在存储第一个实体后立即执行SaveChanges,但这可能会对数据库进行多次调用,我不确定这个解决方案。
另一种方法是在数据库和附加对象中搜索,但我真的不知道该怎么做。
有没有人有更好的主意?
答案 0 :(得分:0)
您可以使用IDENTITY列允许SQL Server在用户未指定时自动填充它,如果您有一个指定它们,则只需将其与其他查询一起放入INSERT / UPDATE查询中领域。它将节省您的价值,而不是创建一个新的价值。如果您对该字段有唯一约束,或者如果您不希望在用户指定值时允许重复,则需要检查并确保在执行此操作之前尚未使用该ID。
以下示例使用名为MyTable的表,其中包含3列(ID int IDENTITY,FIRST_NAME varchar,LAST_NAME varchar)。我建议使用参数而不是传递sql字符串中的值,就像我在下面所做的那样,因为这只是一个例子而且以这种方式组合起来更快。
String sSQL = "";
String sFields = "";
String sValues = "";
String sCode = "";
// sCode = ... (get user entered code)
String sFirstName = "John";
String sLastName = "Doe";
if (sCode != "")
{ //Add the user specified value and field for the identity column to the SQL
sFields = "ID, ";
sValues = sCode + ", ";
}
sFields += "FIRST_NAME, LAST_NAME";
sValues += "'" + sFirstName.Replace("'","''") + "', '" + sLastName.Replace("'","''") + "'";
sSQL = "INSERT INTO MyTable (" + sFields + ") VALUES (" + sValues + ")"
//execute the sql statement