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

时间:2010-03-15 20:45:55

标签: 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,或者如果另一个用户在该用户之后的一小段时间内更新了文章,那么会出现并发的情况吗?

1 个答案:

答案 0 :(得分:4)

您的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();

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

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