在实体框架中使用每个用户的串行字段
本文关键字:用户 字段 框架 实体 | 更新日期: 2023-09-27 17:57:06
我有一个带有代码字段的实体。对于使用此实体的每个用户,用户插入的每个实体都必须具有代码。所以我编写了执行以下逻辑的代码:
1.如果用户设置了代码字段 - 则使用他的代码。
2. 如果用户未设置代码字段 - 从数据库中读取下一个序列号(从 1 开始,搜索尚不存在的下一个序列号)并使用此代码。
问题是这样的场景:
假设用户能够通过单击鼠标添加两个实体。
假设下一个序列号应该是"5"。
在第一个实体中,用户设置 code=5,在第二个实体中,用户不设置代码。
因为我使用的是实体框架,并且在逻辑末尾有一个提交/保存更改,所以我插入第一个实体(代码=5的实体),对于第二个实体,在数据库中搜索下一个尚不存在的下一个串行代码。数据库中尚不存在的下一个序列号是"5"。所以我将第二个实体设置为代码"5"。
最终我想出了两个 code=5 的实体,这是错误的。
我想到了解决它的方法。
一种方法是在存储第一个实体后立即执行 SaveChanges,但这可能会对数据库进行多次调用,我不确定此解决方案。
另一种方法是在数据库和附加对象中搜索,但我真的不知道该怎么做。
有人有更好的主意吗?
您可以使用 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