问题是这样的:我使用的数据库是Mysql,需要一次性往6张表里面添加数据,而且一张表可能会添加多条数据。总共的数据最多30条,要么全部添加成功,要么全部失败。我查看资料EF中的 context.SaveChanges();是有事务功能的,于是我是这样写的:
public bool InsertRegisterDBModel(RegisterDBModel dbModel)
{
int i = 0;
try
{
//using (TransactionScope scope = new TransactionScope())
//{
context.Companies.Add(dbModel.company);
//i+= context.SaveChanges();
context.Accounts.Add(dbModel.account);
//context.SaveChanges();
//i += context.SaveChanges();
foreach (AccountProApp accountProApp in dbModel.accountProAppList)
{
context.AccountProApps.Add(accountProApp);
//i += context.SaveChanges();
}
if (dbModel.openedEmailList.Count > 0)
{
foreach (OpenedEmail email in dbModel.openedEmailList)
{
context.OpenedEmails.Add(email);
// i += context.SaveChanges();
}
}
if (dbModel.openedFaxVoiceList.Count > 0)
{
foreach (OpenedFaxVoice faxVoice in dbModel.openedFaxVoiceList)
{
context.OpenedFaxVoices.Add(faxVoice);
//i += context.SaveChanges();
}
foreach (FaxVoiceDetail faxVoiceDetail in dbModel.faxVoiceDetailList)
{
context.FaxVoiceDetails.Add(faxVoiceDetail);
// i += context.SaveChanges();
}
}
i = context.SaveChanges();
// scope.Complete();
//}
}
catch (Exception ex)
{
i = 0;
}
return i > 0;
}
在每次添加数据直接add(),所有的数据添加后才使用context.SaveChanges()。如果SaveChanges()有事务功能的话,那么应该能够达到我的目的。但是却报这个错误(如下图),貌似是什么 内嵌事务不受支持,而且奇怪的是,数据库中部分数据添加成功了。更更奇怪的是:如果添加的数据较少就不会报错而顺利执行,只要数据稍稍多了就会报这个错(上面代码中通常是最后的那张表数据较多)!被这个问题困扰很久,跪求大神指点!



------解决思路----------------------
参考 https://msdn.microsoft.com/en-us/data/dn456843
------解决思路----------------------
EF的SaveChanges确实有事务功能,这个3楼的链接里面有:
"In all versions of Entity Framework, whenever you execute SaveChanges() to insert, update or delete on the database the framework will wrap that operation in a transaction. This transaction lasts only long enough to execute the operation and then completes. When you execute another such operation a new transaction is started."
不过事务肯定也需要底层的ado.net provider的支持,LZ的问题是mysql的provider里面报出来的错误。这个能搜到一些同样的问题,貌似是EF的事务方式和mysql的.net connector还不太兼容,mysql上有这个bug的报告,解决方案是使用TransactionScope,不过我没试过。