c# - 使用 LINQ To SQL 检索新插入的记录 ID

标签 c# linq-to-sql

使用以下内容:

private BlogDataContext db = new BlogDataContext ();

article.Created = DateTime.UtcNow;
article.Modified = DateTime.UtcNow;

db.Articles.InsertOnSubmit(article);
db.SubmitChanges();

int id = article.Id;

我想知道这样安全吗?它会给我用户刚刚插入的文章的 Id 吗,或者如果另一个用户在该用户之后几分之一秒更新文章,是否会出现并发情况?

最佳答案

您的 dataContext 实例(名为 db)将捕获数据库在插入时生成的标识值。如果另一个用户在那之后修改了该值,您不仅看不到它,而且 DataContext 实例会在询问时为您提供现在过时的值!如果您考虑 DataContext 必须如何对数据修改进行对象跟踪,这是有道理的。

如果您尝试添加父记录,然后以“安全”(原子)方式添加子记录,请改为:

Order o1 = new Order() {Date = DateTime.Now, Quantity = 3};
Order o2 = new Order() {Date = DateTime.Now, Quantity = 4};

Customer c1 = new Customer() {Name = "Bob"};
c1.Orders.Add(o1);
c1.Orders.Add(o2);

db.InsertOnSubmit(c1);
db.SubmitChanges();

客户和两个订单都将被插入数据库 - 全部或全部(如果没有,您会得到一个异常告诉您原因)。

请注意,我使用了关系属性:Customer.Orders 而不是使用 ID。这是因为我不知道数据库会生成什么Id。 DataContext 也不知道。但是,如果您检查 Customer.Orders 自动生成的代码 - 您会看到 ID 是在那里管理的。

关于c# - 使用 LINQ To SQL 检索新插入的记录 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2450363/

相关文章:

c# - 关闭 websocket 最正确的方法是什么

linq-to-sql - Linq to SQL-按订购的总数量分组产品

c# - 如何通过查找器界面在 Entity Framework 4 中查找实体? (适用于 Linq To Sql)

c# - LINQ-to-SQL - 不能将空值分配给具有类型的成员

sql - System.Void' 不是映射存储过程方法的有效返回类型

C# .net 日期时间到整数值

c# - c#main方法的工作方式

c# - 值对象的 IEqualityComparer

c# - Server.Transfer 导致 Session 异常

c# - 事务(进程 ID 56)在锁定时陷入僵局?