【问题标题】:How do I get Id of a record without submitting and re-querying?如何在不提交和重新查询的情况下获得记录的 ID?
【发布时间】:2012-09-25 13:41:27
【问题描述】:

我有一个设置为自动递增的 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();

更多上下文,请查看标签。

【问题讨论】:

    标签: c# sql linq-to-sql auto-increment insertonsubmit


    【解决方案1】:

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

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

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

    【讨论】:

    • 最终,我的目标是在另一个引用该用户的表中插入一条记录,因此我需要该用户的 ID。
    • 提交后会在user.Id中找到
    • 值得注意的是,可以通过关闭属性上的IsDbGenerated“自动生成的值”)来禁用Id上的服务器端生成主键值在 L2S .dbml 文件中。
    • -1:不,很抱歉,但这不是 linq-2-sql 的设计方式。您正在考虑太多面向数据库。您必须分配实体,而不是外键。请参阅我的答案
    • @Pleun 是的,我回答的是直接问题,你的回答更好
    【解决方案2】:

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

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

    所以不要这样做

    somerelated_table.fk_user_id = user.id
    

    你会的

    somerelated_table.user = user
    

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

    如果您需要 Id 进行某些操作不使用使用 linq-2-sql,您无论如何都可以在提交更改之后执行此操作,无论如何都无所谓

    【讨论】:

    • 谢谢,将其更改为答案。非常有帮助,也让我看到了 linq-2-sql 的工作方式,再次感谢。你是对的——这正是我“需要”用户 ID 值的原因。
    • 欢迎您,习惯 L2S 需要一点时间,但之后您会更有效率..
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 2021-02-15
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      相关资源
      最近更新 更多