Не все записи обновляются в DataContext.SubmitChanges () (Linq to SQL) - PullRequest
1 голос
/ 07 марта 2011

Короче говоря, одна конкретная запись в одной таблице обновляется, в то время как несколько дополнительных изменений в той же таблице не обновляются.

theStat обновляется нормально при .SubmitChanges()

statToIncrease экземплярахобновлять не после SubmitChanges()

После просмотра .GetChangeSet() выполняется только одно обновление.Почему никакие экземпляры statToIncrease не обновляются при изменении?Нужно ли открывать новый DataDataContext для каждого обновления?

Таблица UserStat 1019 * имеет первичный ключ .

Возможно, еще один вопрос

Было бы целесообразно расширить мой класс UserStat с помощью метода, подобного .Add(double amountToAdd)?Необходимо было бы открыть другое соединение, но это позволило бы мне продолжать использовать только LINQ, верно?

        using (DataDataContext db = new DataDataContext())
        {
            Random r = new Random();

            var theStat = db.UserStats.FirstOrDefault();

            // tried scoping `statToIncrease` outside of the for loop
            // didn't fix anything
            UserStat statToIncrease = null;

            for (int i = 0; i < vm.stats.Count(); i++)
            {
                statToIncrease = db.UserStats.Where(s => s.ID == i)
                    .FirstOrDefault();
                // here, .Property is type float
                statToIncrease.Property += r.NextDouble();
                // here, .Property is type int
                theStat.Property -= 1;
            }

            // create and insert another object
            // this object is inserted correctly

            // right here, .ChangeSet() only has one insert and one update
            // the update is only for `theStat` and not 
            // any modifications to `statToIncrease`
            db.SubmitChanges();
        }

Обновление

Я нашел уродливый способделаем это:

db.ExecuteCommand("UPDATE [UserStat] SET [Value] = {0} WHERE [ID] = {1}, 
    statToIncrease.Value + amount, statToIncrease.ID");

Ответы [ 3 ]

1 голос
/ 10 марта 2011

Я не уверен, в чем именно проблема, но кажется странным, что вы повторно используете одну и ту же переменную (statToIncrease) и извлекаете по одной записи за раз.Представляется более разумным извлечь список объектов, выполнить итерацию по списку и обновить их, а затем вызвать SubmitChanges:

using (DataDataContext db = new DataDataContext())
{
    var r = new Random();

    UserStat theStat = db.UserStats.FirstOrDefault();

    List<UserStat> statsToIncrease = 
                               db.
                               UserStats.
                               Where(s => s.ID >= 0 && s.ID < vm.stats.Count()).
                               ToList();

    foreach (UserStat statToIncrease in statsToIncrease)
    {
        statToIncrease.Property += r.NextDouble();
        theStat.Property -= 1;
    }

    db.SubmitChanges();
}
0 голосов
/ 08 марта 2011

Вот ваша проблема:

.Where(s => s.ID == 1).FirstOrDefault();

это, очевидно, будет возвращать один и тот же объект на каждой итерации.И я предполагаю, что theStat имеет идентификатор 1, поэтому он обновляется.

0 голосов
/ 07 марта 2011

Попытайтесь явно присоединить ваш измененный объект, используя:

db.UserStats.Attach(statToIncrease, true);
...
db.SubmitChanges();

Нужно ли открывать новый DataDataContext для каждого обновления?

Нет, у вас нет«т.

...