0

我有一个设置为自动递增的 ID(显然是 int)。

var dc = new DataContext([STRING]);

var usersTable = dc.GetTable<Audit_User>();

var user = usersTable.FirstOrDefault(o => o.Username.Equals("NAME"));

if (user == null)
{
   user = new Audit_User()
   {
      Username = "NAME"
   };

   usersTable.InsertOnSubmit(user);
}

//HERE - I need access to the user Id

dc.SubmitChanges();

有关更多上下文,请参阅标签。

4

3 回答 3

4

//这里 - 我需要访问用户 ID

其实你没有。如果您始终使用 linq-2-sql,则可以分配用户实体而不是设置 user.id 来填充关系(最可能的原因是您需要 ID)。

所以而不是做

somerelated_table.fk_user_id = user.id

你做

somerelated_table.user = user

当您调用 SubmitChanges 时,Linq-2-sql 将处理 user.id 的正确分配。另外,作为奖励,这一切都将在一次交易中完成。这就是 linq-2-sql 的美妙之处。

如果您在使用 linq-2-sql 的情况下需要 Id 进行某些操作,您可以在 submitchanges 之后无论如何都可以这样做,无论如何都没关系

于 2012-10-04T20:09:52.510 回答
1

在将数据提交到 SQL Server 之前,您无法获取 ID,因为它是在服务器端生成的。如果您非常需要这样做,我建议在客户端生成 ID(这可能会很痛苦)。

另一个问题是为什么你需要在插入一行之前访问那个ID,在大多数情况下这可能是对linq2sql如何工作的误解。

有时在数据库中没有为表设置外键。要在引用的表中插入 ID,只需在插入后立即从 yourEntity.ID 中获取它,它应该由系统填充。不要忘记再次提交更改。

于 2012-10-04T13:47:46.060 回答
0

好吧,在您的代码中,user.ID包括用户 ID(如果它以前存在,当然如果它是新的)。我不确定,但我认为 SubmitChanges 还会自动查询新记录的新 ID 并自动填充现有的对象标识属性,因此在您的情况下,如果您使用 user.ID 之后使用它,则不会花费额外的查询SubmitChanges(如果它是新记录并且您没有调用 SubmitChanges,它将为 0)

但是,如果您想在调用 SubmitChanges 之前使用 id,在将其添加到数据库之前定义“ID”的最佳方法是将 ID 设为数据库上的唯一标识符 (System.Guid),然后简单地将其插入GUID 已在 INSERT 语句中定义。

请注意插入可能会失败,在这种情况下,您必须确保如果出现问题,您在假设与您使用的 Guid 具有相同 ID 的用户存在时所做的任何事情都将被回滚。

于 2012-10-04T13:54:30.067 回答