2010-03-15 55 views
1

使用下列内容:找回新插入的记录ID与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,或者如果另一个用户在该用户之后更新文章几分之一秒,是否会出现并发情况?

回答

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

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

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

+0

男人,非常感谢你的答案是正确的,我通常会插入你的建议,但在这里我有一个动态系统,并会有插件,所以这个想法是插件动态插入Cpanel,然后当用户插入记录我保存在会话中插入的ID,并使用它插件插入他们的数据到各自的DBS。 我希望有更好的办法 – DevMania 2010-03-16 06:39:43