加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 具有多表插入的EntityFramework事务回滚

发布时间:2020-12-16 01:58:15 所属栏目:百科 来源:网络整理
导读:问题:我需要在多表插入中获取一个标识,我需要在Entity Framework中包含它周围的事务支持. 我有两个(伪通用的)对象与对应的表,书和作者: create table Author(authorid int identity primary key,authorname varchar(max))create table Book(bookid int ide
问题:我需要在多表插入中获取一个标识,我需要在Entity Framework中包含它周围的事务支持.

我有两个(伪通用的)对象与对应的表,书和作者:

create table Author
(authorid int identity primary key,authorname varchar(max)
)

create table Book
(bookid int identity primary key,bookname varchar(max),authorid int references Author(authorid)
)

我的问题是,当我需要用新作者插入一本新书时,我最终需要做这样的事情,如果Book插入引发异常我有一个没有Book的作者,这对我的应用程序不利.

context.Authors.Add(newauthor);
context.SaveChanges();
newbook.AuthorID = newauthor.ID //I can read this now because the SaveChanges() created the ID
context.Books.Add(newbook);
context.SaveChanges();

我浏览了this article,它基本上表示不使用与EntityFramework的事务,并建议每次操作调用一次SaveChanges()并让EF自己处理事务.我很乐意,但我需要首先从表中获取身份,如我的伪代码和this SO question中所示

解决方法

问题是 – 你绝对需要插入作者的ID吗?

您可以先使用代码或使用db优先使用Entity进行开发.如果您首先使用数据库,您将拥有带生成实体的.edmx文件,具有导航属性和集合……那么,上面的关键特征是什么,对于Author实体,您将拥有Books集合,这要归功于关系authorid int在您的表Book中引用Author(authorid).
因此,要向作者添加书籍,只需制作以下内容:

//Somewhere here author is created,add it to context.Authors
context.Authors.Add(newauthor);

//Somewhere here book is created,don't need to add it to context.Books; don't call SaveChanges either
newauthor.Books.Add(newbook);// And this is all you need; ID management will be done by Entity,automatically

context.SaveChanges(); // Only one call to save changes you will need
//Of course,all IDs of inserted entities will be available here...

类似的结构也将首先对代码有效;在作者实体中,您很可能会有公共虚拟ICollection< Book>书籍收藏.并且将以与上述相同的方式完成书的创建.

当然,您可以使用多个context.SaveChanges()来获取新插入实体的ID – 您不应该这样做.每个SaveChanges()只是广告到服务器的往返,并且可能最终会导致性能不佳.如上所述,最好将ID值的管理留给Entity.

并且,完成故事.使用上面的结构,EF会自动将所有内容包装到事务中的SaveChanges()中.因此,如果书籍插入失败,作者插入也将被撤消.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读