在软件开发过程中,我们经常会遇到这样的场景,主从表,主表添加一条记录(主键自动增长),从表添加多条记录,同时从表需要用到刚刚添加的主表的自动增长的主键id,接下来我们就演示一下在EF中怎么实现事务,我们假设TUsers表与TUsersExtInfo表,代码如下:
class Program
{
static void Main(string[] args)
{
CodeFirstContext context = new CodeFirstContext();
//IDbTransaction trans = null;
DbTransaction trans=null;
try
{
//打开连接
context.Database.Connection.Open();
//开始事务
trans = context.Database.Connection.BeginTransaction();
//context.Database.UseTransaction(trans);//这句不加的话,引发异常,"SqlConnection不支持并行事务"
TUsers user = new TUsers();
user.Account = "admin123";
user.Password = "123456789";
user.CreateDate = DateTime.Now;
context.Users.Attach(user);
context.Entry(user).State = EntityState.Added;
var affectcount = context.SaveChanges();
TUsersExtInfo userExt = new TUsersExtInfo();
userExt.UserId =user.UserId;//获取刚刚添加的自动增长id
context.UsersExtInfo.Attach(userExt);
context.Entry(userExt).State = EntityState.Added;
affectcount = context.SaveChanges();
//throw new Exception("发生异常");
trans.Commit();
Console.WriteLine(string.Format("新添加记录id:{0}", user.UserId));
var userlist = context.Users.ToList();
foreach (var u in userlist)
{
Console.WriteLine(string.Format("账号:{0} 密码:{1}", u.Account, u.Password));
}
}
catch (Exception ex)
{
trans.Rollback();
Console.WriteLine("错误信息:" + ex.Message);
}
finally
{
context.Database.Connection.Close();
}
}
}
或者直接使用SQL也可以。