Linq to SQL - не удается обновить - PullRequest
7 голосов
/ 10 июня 2010

У меня проблемы с обновлением linq до sql сущностей.По какой-то причине я могу обновить каждое поле моего item объекта, кроме name .

Вот два простых теста, которые я написал:

 [TestMethod]
        public void TestUpdateName( ) {
            using ( var context = new SimoneDataContext( ) ) {
                Item item = context.Items.First( );

                if ( item != null ) {
                    item.Name = "My New Name";
                    context.SubmitChanges( );
                }
            }
        }

        [TestMethod]
        public void TestUpdateMPN( ) {
            using ( var context = new SimoneDataContext( ) ) {
                Item item = context.Items.First( );

                if ( item != null ) {
                    item.MPN = "My New MPN";
                    context.SubmitChanges( );
                }
            }
        }

К сожалению,TestUpdateName () завершается ошибкой со следующей ошибкой: System.Data.SqlClient.SqlException: Incorrect syntax near the keyword 'WHERE'..

А вот выходной SQL:

UPDATE [dbo]. [Items] SET WHERE ([Id] = @ p0) И ([CategoryId] = @ p1) И ([MPN] = @ p2) И ([Высота] = @ p3) И ([Ширина] = @ p4) И ([Вес] = @ p5) И ([Длина] = @ p6) AND ([AdministrativeCost] = @ p7) - @ p0: вход Int (размер = 0; точный = 0; масштаб = 0) [1] - @ p1: вход Int (размер = 0; точный= 0; Масштаб = 0) [1] - @ p2: входной VarChar (размер = 10; точный = 0; масштаб = 0) [Мой новый MPN] - @ p3: десятичный входной сигнал (размер = 0; точный = 5; Scale = 3) [30.000] - @ p4: десятичное число ввода (размер = 0; Prec = 5; масштаб = 3) [10.000] - @ p5: десятичное число ввода (Size = 0; Prec = 5; масштаб = 3)) [40.000] - @ p6: десятичный ввод (размер = 0; точный = 5; масштаб = 3) [30.000] - @ p7: денежный ввод (размер = 0; точный = 19; масштаб = 4) [350.0000]- Контекст:SqlProvider (Sql2008) Модель: AttributedMetaModel Сборка: 3.5.30729.4926

Как видите, обновление не генерируется (SET пусто ...) Понятия не имею, почему это происходит.

И уже заранее ... ДА, в таблице Item есть PK (Id). Заранее спасибо !

Обновление: Похоже, что ошибка вызвана переопределением GetHashcode ().Это моя текущая реализация:

return string.Format( "{0}|{1}|{2}|{3}", Name, Id, UPC, AdministrativeCost).GetHashCode( );

Ответы [ 2 ]

12 голосов
/ 10 июня 2010

Похоже, ваш DBML не синхронизирован. Вам следует удалить таблицы, заново добавить их и попробовать запустить их снова.

Просто удалите таблицу Items вручную и заново добавьте ее.

РЕДАКТИРОВАТЬ : На основании ваших правок, вы должны проверить следующую ветку относительно GetHashCode.

http://social.msdn.microsoft.com/forums/en-US/linqtosql/thread/6cc6c226-f718-4b22-baad-dba709afe74b/

.Net правила утверждают, что GetHashCode () и Equals () всегда должен быть реализовано в тандеме. Два объекта равные должны иметь одинаковый хеш код.

Кроме того, комбинация GetHashCode () + Equals () формирует концепцию идентичности сущности. Если вы делаете это на основе Значения полей (кроме PK), то идентичность меняется при изменении поля. Это плохо, если L2S должен искать другая информация в словаре на основе личность субъекта, и особенно если L2S нужно найти сущность в своем кеш идентичности!

Совет: не меняйте личность сущность. L2S ожидает, что это будет основано на объекте (адрес основанный) личность.

0 голосов
/ 10 июня 2010

Похоже, что генерируемый SQL не включает в себя содержимое предложения SET (обратите внимание, что после SET нет [Name] = @pXX). Все ли свойства (тип данных, размер и т. Д.) Поля сущностей установлены правильно в конструкторе dbml?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...