在实体框架中使用每个用户的串行字段

时间:2011-05-22 09:25:04

标签: c# .net algorithm entity-framework

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

问题是这样的情况:
假设用户能够通过单击鼠标添加两个实体 假设下一个串行代码应为“5” 在第一个实体中,用户设置代码= 5,在第二个实体中,用户不设置代码 因为我正在使用实体框架,并且在逻辑结束时有一个提交/保存更改,我插入第一个实体(代码为5的实体)和第二个实体,在db中搜索下一个下一个序列代码那还不存在。数据库中尚不存在的下一个序列代码是“5”。所以我将第二个实体设置为代码“5” 最终我想出了两个代码= 5的实体,这是错误的。

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

有没有人有更好的主意?

1 个答案:

答案 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