我有一个应用程序,我正在使用Entity Framework或处理数据库表中的数据。有一个主表CUSTOMER
,它通过外键链接到其他3个表。链接表是
RENTAL
PAYMENTS
VEHICLES
我可以使用EF在所有这4个表上添加/编辑/删除实体。
我想将当前场景(其中EF用于处理所有数据库事务)更改为类似的内容。
创建新实体后尝试保存实体(5个新实体) 实体/记录)回到数据库,我想用一个存储 将新实体添加到
VEHICLES
模型并使用EF保存的过程 实体到所有其他模型 - 并且仍然将所有这些都归结为一个 单笔交易。另外,我必须等到EF电话完成,因为我需要 作为EF保存的一部分创建的新
CUSTOMER_ID
作为传递 输入存储过程的参数以保存VEHICLES实体。
我不想从事务外部调用存储过程,因此如果存储过程调用失败,则还会回滚通过EF对数据库所做的更改。
任何人都知道如何完成这项工作?
PS:不寻找任何代码示例;高水平的插图将有所帮助。
我使用的是Entity Framework 5,.Net v4.5,VS 2013,Oracle 11g,ODP.Net
答案 0 :(得分:0)
将存储过程映射到实体 1)创建存储过程 2)更新您的数据模型以包括存储过程 - “通过EF 6.x从数据库更新模型”菜单
3)然后在实体数据模型中找到实体(或创建新实体)并将存储过程挂钩到插入,更新和删除函数 - 右键单击实体,然后选择“存储过程映射”菜单
4)使用LinqToEntity通过Database.BeginTransaction()添加/修改实体 然后在上下文中调用SaveChanges(),然后调用Commit或Rollback。
注意:从EF6 Database.ExecuteSqlCommand()开始,默认情况下会将命令包装在事务中(如果尚未存在)。此方法存在重载,允许您根据需要覆盖此行为。同样在EF6中,通过API(例如ObjectContext.ExecuteFunction())执行模型中包含的存储过程也会执行相同的操作(除了暂时不能覆盖默认行为)。在任何一种情况下,事务的隔离级别都是数据库提供程序认为其默认设置的隔离级别。默认情况下,例如,在SQL Server上,这是READ COMMITTED。 https://msdn.microsoft.com/en-us/data/dn456843.aspx