如何在不提交和重新查询的情况下获取记录的ID?

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

var dc = new DataContext([STRING]); var usersTable = dc.GetTable(); 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(); 

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

//这里 – 我需要访问用户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进行一些操作,那么无论如何你都可以在提交更改之后进行操作,无论如何都无关紧要

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

另一个问题是为什么在插入行之前需要访问该ID,在大多数情况下,可能会误解linq2sql的工作原理。

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

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

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

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