我有一段涉及多个插入的代码,但是在我完成在其他表中的插入之前,需要执行submitchange方法,以便我可以获取ID.我一直在互联网上搜索,找不到如何在Linq to SQL中创建事务.我已经在代码中添加了我希望事务发生的注释.

    var created = false;
    try
    {
        var newCharacter = new Character();
        newCharacter.characterName = chracterName;
        newCharacter.characterLevel = 1;
        newCharacter.characterExperience = 0;
        newCharacter.userUsername = userUsername;
        newCharacter.characterClassID = ccslst[0].characterClassID;
        //Open transaction


            ydc.Characters.InsertOnSubmit(newCharacter);
            ydc.SubmitChanges();

            foreach (var ccs in ccslst)
            {
                var cs = new CharacterStat();
                cs.statId = ccs.statID;                        
                cs.statValue = ccs.statValue;
                cs.characterID = newCharacter.characterID;
                ydc.CharacterStats.InsertOnSubmit(cs);
            }                    


            var ccblst = ydc.ClassBodies.Where(cb => cb.characterClassID == newCharacter.characterClassID);
            foreach (var ccb in ccblst)
            {
                var charBody = new CharacterBody();
                charBody.bodyId = ccb.bodyId;
                charBody.bodyPartId = ccb.bodyPartId;
                charBody.characterID = newCharacter.characterID;
                ydc.CharacterBodies.InsertOnSubmit(charBody);
            }
            ydc.SubmitChanges();      
            created = true;
        //Commit transaction
        }
        catch (Exception ex)
        {
            created = false;
            //transaction Rollback;                    
        }
        return created;

编辑:忘了提到ydc是我的datacontext

推荐答案

把整件东西都包在TransactionScope里.在你想提交的时候拨打transaction.Complete().如果代码在未调用Complete()的情况下退出块,事务将回滚.然而,在看了@s_ruchit的答案并重新判断了代码之后,您可能可以将其重写为不需要TransactionScope.第一个示例将TransactionScope与代码原样一起使用.第二个例子做了一些小改动,但达到了相同的目的.

当您从数据库中读取一个值,并使用它为添加的对象设置一个新值时,需要使用TransactionScope.在这种情况下,LINQ事务将不包括第一次读取,只包括随后提交的新值.由于您使用读取的值来计算写入的新值,因此需要将读取包装在同一事务中,以确保另一个读卡器不会计算相同的值,并避免您的更改.在您的情况下,您只是在进行写操作,因此标准LINQ事务应该可以工作.

例1:

var created = false;

using (var transaction = new TransactionScope())
{
    try
    {
        var newCharacter = new Character();
        newCharacter.characterName = chracterName;
        newCharacter.characterLevel = 1;
        newCharacter.characterExperience = 0;
        newCharacter.userUsername = userUsername;
        newCharacter.characterClassID = ccslst[0].characterClassID;

        ydc.Characters.InsertOnSubmit(newCharacter);
        ydc.SubmitChanges();

        foreach (var ccs in ccslst)
        {
            var cs = new CharacterStat();
            cs.statId = ccs.statID;                        
            cs.statValue = ccs.statValue;
            cs.characterID = newCharacter.characterID;
            ydc.CharacterStats.InsertOnSubmit(cs);
        }                    

        var ccblst = ydc.ClassBodies.Where(cb => cb.characterClassID == newCharacter.characterClassID);
        foreach (var ccb in ccblst)
        {
            var charBody = new CharacterBody();
            charBody.bodyId = ccb.bodyId;
            charBody.bodyPartId = ccb.bodyPartId;
            charBody.characterID = newCharacter.characterID;
            ydc.CharacterBodies.InsertOnSubmit(charBody);
        }
        ydc.SubmitChanges();      
        created = true;

        transaction.Complete();
    }
    catch (Exception ex)
    {
        created = false;
    }
}
return created;

例2:

    try
    {
        var newCharacter = new Character();
        newCharacter.characterName = chracterName;
        newCharacter.characterLevel = 1;
        newCharacter.characterExperience = 0;
        newCharacter.userUsername = userUsername;
        newCharacter.characterClassID = ccslst[0].characterClassID;

        ydc.Characters.InsertOnSubmit(newCharacter);

        foreach (var ccs in ccslst)
        {
            var cs = new CharacterStat();
            cs.statId = ccs.statID;                        
            cs.statValue = ccs.statValue;
            newCharacter.CharacterStats.Add(cs);
        }                    

        var ccblst = ydc.ClassBodies.Where(cb => cb.characterClassID == newCharacter.characterClassID);
        foreach (var ccb in ccblst)
        {
            var charBody = new CharacterBody();
            charBody.bodyId = ccb.bodyId;
            charBody.bodyPartId = ccb.bodyPartId;
            newCharacter.CharacterBodies.Add(charBody);
        }
        ydc.SubmitChanges();      
        created = true;
    }
    catch (Exception ex)
    {
        created = false;
    }

.net相关问答推荐

在PowerShell中,XML子对象和属性是对象属性.它怎麽工作?

PowerShell 5.1和7在使用证书时的区别

为什么这两个比较有不同的结果?

Gacutil.exe 成功添加程序集,但在资源管理器中无法查看程序集.为什么?

在 .NET 反射中使用 GetProperties() 和 BindingFlags.DeclaredOnly

根源是什么?

将 int 转换为 .NET 中的位数组

每第 N 个字符/数字拆分一个字符串/数字?

如何在 WPF 应用程序中使用 App.config 文件?

SQLParameter 如何防止 SQL 注入?

如何将 WebResponse.GetResponseStream 返回转换为字符串?

仅使用 XAML 绘制纯色三角形

Find() 和 First() 抛出异常,如何改为返回 null?

string.Empty vs null.你用哪一个?

如何知道 DateTime 是否在 C# 中的 DateRange 之间

判断 .NET 中的目录和文件写入权限

无法加载文件或程序集System.ValueTuple

SqlBulkCopy 的推荐批量大小是多少?

如何使用通用扩展方法中的字符串列名在 IQueryable 上应用 OrderBy?

如何在 C# 中使用迭代器反向读取文本文件