Linq-to-Sql SubmitChanges, не обновляющий поля …, почему?

Внутри фрагмента в onCreateView () попробуйте использовать:

setRetainInstance(true);

. Проверьте документ здесь: булево)

6
задан Community 23 May 2017 в 12:19
поделиться

5 ответов

Я выяснил свою проблему с помощью ТАКИМ ОБРАЗОМ сообщество. Моя проблема вызывалась фактом, когда я создал свой объект для присоединения, значение по умолчанию столбца было обнулено, поэтому когда это пыталось присвоить значение для обнуления... LinqToSql заявляет эй..., что ничто не изменилось, таким образом, я не обновляю значение.

Что я делаю теперь... только для создания, это работать следующее:

ctx.DataContext.InvoiceItems.Attach(data, true);

Это, кажется, вынуждает все значения записать себя в базу данных. Это работает на данный момент.

2
ответ дан 10 December 2019 в 00:45
поделиться

Я попытался воспроизвести это со следующий код, но для меня он работает.

using (DataClasses1DataContext ctx = new DataClasses1DataContext())
{
    var obj = ctx.DecimalColumnTables.First();
    Debug.Assert(obj.B != 0);
    obj.B = 0;
    ctx.SubmitChanges();
}

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

LINQ к SQL игнорирует обновления текущего значения, поэтому если поле уже было нулем, Вы не можете видеть обновления.

Прочь: OR/M, который Вы используете, является LINQ к SQL. LINQ является названием возможности запросов в.NET, но LINQ не определяет, ни реализует любую логику обновления. Таким образом, проблема касается LINQ к SQL, не LINQ.

3
ответ дан 10 December 2019 в 00:45
поделиться

Очевидный вопрос, но действительно ли Вы уверены, что столбец отображается в dbml / отображающийся файл?

Также - действительно ли это - вычисляемый столбец? (т.е. цена => единицы * unitprice)

2
ответ дан 10 December 2019 в 00:45
поделиться

Еще некоторая информация... Я выяснил свою проблему... это - больше отсутствия понимания о LinqToSql..., где я делаю:

private void Child_Update(Invoice parent)
{
      using (var ctx = Csla.Data.ContextManager
           .GetManager(Database.ApplicationConnection, false))
      {
           var data = new Gimli.Data.InvoiceItem()
           {
                InvoiceItemId = ReadProperty(InvoiceItemIdProperty)
           };

           ctx.DataContext.InvoiceItems.Attach(data);

           if (this.IsSelfDirty)
           {
                // Update properties
           }
     }
}

Я думал, что это загрузит исходные значения..., что происходит, то, что это создает новый объект со значениями по умолчанию... пустые значения, как 0 для десятичных чисел, Гуида. Пустой для uniqueidentifiers и так далее.

Таким образом, когда это обновляет свойства, это уже рассматривает Единицы как 0, и это обнуляет его. Хорошо LinqToSql не распознает это как изменение, таким образом, он не датирует поле. Таким образом, то, что я должен был сделать, следующее:

ctx.DataContext.InvoiceItems.Attach(data, true);

Теперь все модификации сгенерированы в операторе обновления, существует ли действительно изменение или нет. Это работает... кажется небольшим hackish!

2
ответ дан 10 December 2019 в 00:45
поделиться

У меня была эта проблема, и все предложения, которые я видел, не применялись и не работали.

Но я обнаружил, что сделал очень простую ошибку!

При обновлении свойства На самом деле я вызывал собственный метод Set (потому что были и другие вещи, которые нужно было изменить в ответ на рассматриваемое основное свойство).

После нескольких часов царапины в голове я заметил, что мой метод Set обновлял частный член, а не публичное свойство, то есть this._Walking = value;

Все, что мне нужно было сделать, это изменить this на this.Walking = value; и все заработало!

0
ответ дан 10 December 2019 в 00:45
поделиться
Другие вопросы по тегам:

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