使用EF6,您可以使用新交易,例如:
using (var context = new PostEntityContainer()) { using (var dbcxtransaction = context.Database.BeginTransaction()) { try { PostInformation NewPost = new PostInformation() { PostId = 101, Content = "This is my first Post related to Entity Model", Title = "Transaction in EF 6 beta" }; context.Post_Details.Add(NewPost); context.SaveChanges(); PostAdditionalInformation PostInformation = new PostAdditionalInformation() { PostId = (101), PostName = "Working With Transaction in Entity Model 6 Beta Version" }; context.PostAddtional_Details.Add(PostInformation); context.SaveChanges(); dbcxtransaction.Commit(); } catch { dbcxtransaction.Rollback(); } } }
当事情横盘整理时,是否真的需要回滚?我很好奇,因为“提交”说明中说:“提交基础商店交易。”
而“回滚”说明说:“回滚基础商店交易。”
这让我感到好奇,因为在我看来,如果未调用Commit,先前执行的命令将不会被存储(对我来说这是合乎逻辑的)。但是如果是这种情况,调用Rollback函数的原因是什么?在EF5中,我使用了TransactionScope,它没有回滚功能(只有完整功能),这对我来说似乎很合理。由于MS DTC的原因,我不能再使用TransactionScope,但是也不能像上面的示例那样使用try catch(即,我只需要Commit)。
您不需要Rollback手动调用,因为您正在使用该using语句。
Rollback
using
DbContextTransaction.Dispose方法将在using块的末尾被调用。如果未成功提交事务(未调用或遇到异常),它将自动回滚事务。以下是SqlInternalTransaction.Dispose方法的源代码(DbContextTransaction.Dispose使用SqlServer提供程序时将最终委托给该方法):
DbContextTransaction.Dispose
SqlInternalTransaction.Dispose
private void Dispose(bool disposing) { // ... if (disposing && this._innerConnection != null) { this._disposing = true; this.Rollback(); } }
您会看到,它检查是否_innerConnection不为null,如果不为null,则回滚事务(如果已提交,则为_innerConnectionnull)。让我们看看Commit它的作用:
_innerConnection
Commit
internal void Commit() { // Ignore many details here... this._innerConnection.ExecuteTransaction(...); if (!this.IsZombied && !this._innerConnection.IsYukonOrNewer) { // Zombie() method will set _innerConnection to null this.Zombie(); } else { this.ZombieParent(); } // Ignore many details here... } internal void Zombie() { this.ZombieParent(); SqlInternalConnection innerConnection = this._innerConnection; // Set the _innerConnection to null this._innerConnection = null; if (innerConnection != null) { innerConnection.DisconnectTransaction(this); } }