Как создать LINQ к Транзакции SQL?

Внешний ключ - это отношение один-ко-многим, а не один-к-одному. Здесь у Инвестиции есть один Инвестор, но у Инвестора есть много Инвестиций. Таким образом, от вашего инвестора вам нужно использовать обратное отношение, которое по умолчанию заканчивается в set, и является управляющим:

b.investment_set.all()
67
задан Rex M 2 May 2009 в 02:00
поделиться

2 ответа

Оберните все это в TransactionScope . Вызовите action.Complete () в точке, где вы хотите зафиксировать. Если код выходит из блока без вызова Complete () , транзакция будет отменена. Однако, посмотрев на ответ @ s_ruchit и повторно изучив свой код, вы, вероятно, могли бы переписать его так, чтобы он не требовал TransactionScope . В первом примере используется TransactionScope с вашим кодом как есть. Второй пример вносит некоторые незначительные изменения, но выполняет ту же цель.

Место, где вам нужно будет использовать TransactionScope , - это когда вы читаете значение из базы данных и используете его для установки нового значение добавляемого объекта. В этом случае транзакция LINQ выиграла t охватывает первое чтение, только позднее отправка нового значения. Поскольку вы используете значение из чтения для вычисления нового значения для записи, необходимо, чтобы чтение было заключено в ту же транзакцию, чтобы другой читатель не вычислил это же значение и не устранил ваше изменение. В вашем случае вы только делаете записи, поэтому стандартная транзакция 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;
    }
68
ответ дан 24 November 2019 в 14:40
поделиться

Вам не нужно делать явную реализацию транзакций при использовании LINQ to SQL. Все операции с БД по умолчанию заключены в транзакцию.

Пример:

AppDataContext db = new AppDataContext();

<In memory operation 1 on db>
<In memory operation 2 on db>
<In memory operation 3 on db>
<In memory operation 4 on db>

db.SubmitChanges();

Все операции между инициализацией db DataContext и db.SubmitChanges () обернуты вокруг транзакции базы данных с помощью .Net, обеспечивающей согласованность вашей базы данных и поддержание целостности свойств в разных таблицах.

Читать статью Скотт Гатри здесь : - http://weblogs.asp.net/scottgu/archive/2007/07/11/linq-to-sql-part-4-updating- our-database.aspx

40
ответ дан 24 November 2019 в 14:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: