entity-framework – 使用Entity Framework实现if-not-exists-in
发布时间:2020-12-12 16:38:31 所属栏目:MsSql教程 来源:网络整理
导读:使用LINQ-to-Entities 4.0,是否有正确的模式或构造来安全地实现“如果不存在然后插入”? 例如,我目前有一个跟踪“用户收藏夹”的表格 – 用户可以从他们的收藏夹列表中添加或删除文章. 基础表不是真正的多对多关系,而是跟踪一些其他信息,如添加日期. CREATE
使用LINQ-to-Entities 4.0,是否有正确的模式或构造来安全地实现“如果不存在然后插入”?
例如,我目前有一个跟踪“用户收藏夹”的表格 – 用户可以从他们的收藏夹列表中添加或删除文章. 基础表不是真正的多对多关系,而是跟踪一些其他信息,如添加日期. CREATE TABLE UserFavorite ( FavoriteId int not null identity(1,1) primary key,UserId int not null,ArticleId int not null ); CREATE UNIQUE INDEX IX_UserFavorite_1 ON UserFavorite (UserId,ArticleId); 根据需要,使用相同的用户/文章对插入两个收藏夹会导致重复的键错误. 我现在使用C#在数据层中实现了“if not exists then insert”逻辑, if (!entities.FavoriteArticles.Any( f => f.UserId == userId && f.ArticleId == articleId)) { FavoriteArticle favorite = new FavoriteArticle(); favorite.UserId = userId; favorite.ArticleId = articleId; favorite.DateAdded = DateTime.Now; Entities.AddToFavoriteArticles(favorite); Entities.SaveChanges(); } 这种实现的问题是它容易受到种族条件的影响.例如,如果用户双击“添加到收藏夹”链接,则可以将两个请求发送到服务器.第一个请求成功,而第二个请求(用户看到的那个)失败,并且UpdateException将包含重复键错误的SqlException. 使用T-SQL存储过程,我可以使用具有锁提示的事务来确保不会发生竞争条件.有没有干净的方法来避免实体框架中的竞争状况,而不诉诸于存储过程或盲目吞咽异常? 解决方法您可以尝试将其与“着名”try / catch模式结合在一起的事务中:using (var scope = new TransactionScope()) try { //...do your thing... scope.Complete(); } catch (UpdateException ex) { // here the second request ends up... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |