c# - 在 Entity Framework 中为每个用户使用序列字段

标签 c# .net algorithm entity-framework

我有一个带有代码字段的实体。对于使用此实体的每个用户,用户插入的每个实体都必须具有代码。所以我编写了执行以下逻辑的代码:
1. 如果用户设置了代码字段 - 然后使用他的代码。
2. 如果用户没有设置代码字段——从数据库中读取下一个序列代码(从1开始,搜索下一个不存在的序列代码)并使用这个代码。

问题是这样的场景:
假设用户可以通过单击鼠标添加两个实体。
假设下一个序列号应该是“5”。
在第一个实体中,用户设置代码=5,在第二个实体中,用户未设置代码。
因为我正在使用 Entity Framework 并且在逻辑末尾有一个提交/保存更改,所以我插入第一个实体(代码为 5 的实体)和第二个实体,在数据库中搜索下一个序列代码那还不存在。数据库中不存在的下一个序列代码是“5”。所以我将第二个实体设置为代码“5”。
最终我想出了两个代码为 5 的实体,这是错误的。

我想办法解决了。
一种方法是在存储第一个实体后立即执行 SaveChanges,但这可能会对数据库进行多次调用,我不确定该解决方案。
另一种方法是在数据库和附加对象中搜索,但我真的不知道该怎么做。

有没有人有更好的主意?

最佳答案

您可以使用一个 IDENTITY 列来允许 SQL Server 在用户没有指定时自动填充它,而当您有一个他们指定的列时,您只需将它与另一个一起放入您的 INSERT/UPDATE 查询中领域。它会保存你的值(value)而不是创造一个新的值(value)。如果您对该字段有唯一约束,或者如果您不想在用户指定值时允许重复,那么您确实需要检查并确保在执行此操作之前尚未使用该 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

关于c# - 在 Entity Framework 中为每个用户使用序列字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6087059/

相关文章:

algorithm - 理解 Dijkstra 算法

c# - MVC 6 组权限无法获取角色

c# - 从流中读取失败 - mysql_native_password 错误

.net - Windows Service System.Timers.Timer无法启动

algorithm - 用于在两个不同内核上运行两个独立函数的 MATLAB Parallel Toolbox

c++ - 帮助反向运动学算法

c# - 如何在 C# 中解析和使用 htpasswd 文件

c# - 如何实现协议(protocol)

c# - 多线程应用程序中的异常。

c# - 如何使用带有 MVVM 的 WPF 应用程序中的 FolderBrowserDialog