Linq2Sql - при попытке обновить, но оператор Set в sql пуст

Это странно... сделанные загрузки обновлений времен прежде, но не может определить, почему это отличается. хотя я использую .net 4.0 теперь - однако я сомневаюсь, что это - ошибка в своей реализации L2S. Не как это странное и замечательное приложение его. Хотя я абсолютно уверен, что этот код работал, пока я использовал RC.

Мне также удалось воспроизвести эту ошибку путем разрабатывания проекта с нуля с помощью информации ниже.

проблема здесь состоит в том, что оператор обновления, сгенерированный L2S, не имеет никаких полей в операторе набора. Я попытался проверить, что pk установлен (только причина, почему я думал бы, что ervery поле будет требоваться в, где), и также читают вокруг других dbml свойств. Я использовал linq2Sql в течение приблизительно 1 года и никогда не имел проблемы.. я все еще думаю, что у меня просто есть огромный заскок.

Примечание: Я очистил равняние и методы GetHashCode для удаления некоторых полей - проблема сохраняется после этого. Я не очистил SQL все же.

У меня есть клиентский класс от dbml, я добавил метод, названный обновлением

public partial class Client :  ICopyToMe<Client>

Метод CopyToMe наследован от интерфейса

   public  interface ICopyToMe<T>
    {
        void CopyToMe(T theObject);
    }

также класс имеет переопределенный getHashCode

public override int GetHashCode()
{
    int retVal = 13 ^ ID ^ name.GetHashCode();
    return retVal;
}

и равняется

public override bool Equals(object obj)
{
    bool retVal = false;
    Client c = obj as Client;
    if (c != null)
        if (c.ID == this.ID && c._name == this._name)
            retVal = true;
    return retVal;
} 

метод обновления в частичном классе

 public void UpdateSingle()
        {          
            L2SDataContext dc = new L2SDataContext();
            Client c = dc.Clients.Single<Client>(p => p.ID == this.ID);
            c.CopyToMe(this);
            c.updatedOn = DateTime.Now;

            dc.SubmitChanges();
            dc.Dispose();
                        }

Метод CopytoMe

 public void CopyToMe(Client theObject)
        {
            ID = theObject.ID;
            name = theObject.name;                
        }

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

exec sp_executesql N'UPDATE [dbo].[tblClient]
SET 
WHERE ([ID] = @p0) AND ([name] = @p1) AND ([insertedOn] = @p2) AND ([insertedBy] = @p3) AND ([updatedOn] = @p4) AND ([updatedBy] = @p5) 
AND ([deletedOn] IS NULL) AND ([deletedBy] IS NULL) AND (NOT ([deleted] = 1))',N'@p0 int,@p1 varchar(8000),@p2 datetime,@p3 int,@p4 
datetime,@p5 int',@p0=103,@p1='UnitTestClient',@p2=''2010-05-17 11:33:22:520'',@p3=3,@p4=''2010-05-17 11:33:22:520'',@p5=3

Я понятия не имею, почему это не работает... использовал это отчасти

выберите объект->, поле набора к новому значению-> отправляет выбранный объект

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

какие-либо идеи?

Эта проблема делает, находятся, похожи, я оказываюсь перед необходимостью возвращаться назад к ADO.NET, который сделал бы меня грустным.

6
задан 11 revs, 4 users 99% 19 May 2010 в 10:32
поделиться

2 ответа

Хорошо, после некоторых дискуссий с очень полезными людьми из Microsoft я нашел ответ на эту проблему.

Linq использует хеш-код для индексации своих коллекций в хеш-таблице. Это означает, что функция хэш-кода должна работать только с полями, которые однозначно идентифицируют объект.

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

Equals, с другой стороны, может тестировать по большему количеству полей, т. Е. Его тест более конкретен, чем сравнения GetHashCode.

Если вы заставите функцию GetHashCode покрывать больше полей, чем первичные ключи, то linq2sql потеряет отслеживание объекта и будет вести себя очень странно.

1
ответ дан 17 December 2019 в 22:11
поделиться

Если в базу данных отправляется именно этот оператор UPDATE (без каких-либо аргументов SET), значит, вы обнаружили ошибку в LINQ to SQL. Попробуйте свой код в .NET 4.0, и если он по-прежнему не работает, отправьте сообщение об ошибке на сайт Microsoft connect.

0
ответ дан 17 December 2019 в 22:11
поделиться
Другие вопросы по тегам:

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