Я пришел из мира asp.net, где мы бы использовали источник данных объекта, подключились к уровню доступа к данным и установили его свойство ConflictDetection на «CompareAllValues». В ObjectDataSource есть OldValuesParameterFormatString, который вы используете для определения параметров старых значений.

Процедура sql, которая выполняет обновление, потребует как новых, так и старых параметров, и все… Очень просто реализовать; ODS обработал старые значения за вас.

Я перешел с Linq на SQL и WinForms. Я создал службу WCF, которая является нашим бизнес-уровнем, и у меня есть хранимая процедура, которая обновляет некоторую таблицу. В конструкторе контекста данных я вижу, что в столбцах моего класса есть свойство «Проверка обновлений». Я не обновляю таблицу напрямую из класса, а вызываю хранимую процедуру для обновления. Есть ли способ сохранить исходные значения, возможно, из контекста данных, аналогично тому, как это сделал бы источник данных объекта?

2
Billy Coover 7 Май 2009 в 22:33
Несколько примеров кода было бы неплохо; как вы вызываете хранимую процедуру?
 – 
Andomar
8 Май 2009 в 01:53
У меня есть ссылка на службу ... Так что это простой вызов: ServiceReference1.Service1Client client = new ServiceReference1.Service1Client (); затем client.UpdateSomeTable (); Очевидно, что параметры будут как новыми, так и старыми значениями. С источником данных объекта это было несложно.
 – 
Billy Coover
8 Май 2009 в 20:06

3 ответа

Лучший ответ

Вы используете хранимые процедуры напрямую (через SqlCommand) или через LINQ to SQL? LINQ to SQL поддерживает использование хранимых процедур для всего доступа к базе данных. Возможно, вы захотите посмотреть Обновление нашей базы данных с использованием хранимых процедур, часть 7 из Серия сообщений в блоге Скотта Гатри о LINQ to SQL. Вы можете настроить использование sprocs через конструктор DBML или в коде, используя частичный класс DataContext. Идея состоит в том, что вы отправляете как новые, так и исходные значения (например, Name и OriginalName) в sproc, чтобы он мог выполнять проверку параллелизма.

Если вы используете sproc напрямую, а не через LINQ to SQL, и все, что вам нужно, это получить исходные значения объекта, вы можете получить их, используя Table<T>.GetOriginalEntityState() следующим образом:

Order modifiedOrder = db.Orders.First();  // using first Order as example
modifiedOrder.Name = "new name";          // modifying the Order
Order originalOrder = db.Orders.GetOriginalEntityState(modifiedOrder);
3
Lucas 1 Июн 2009 в 19:04

Это не тот ответ, который вы, возможно, ищете, но поскольку вы упомянули об использовании WCF в качестве бизнес-уровня вместе с LINQ2SQL, я счел своим долгом указать на эту статью для справки:

http://www.sidarok.com/web/blog/content/2008/05/26/linq-to-sql-with-wcf-in-a-multi-tiered-action-part-1.html

Хотя в статье ASP.NET реализован в качестве основного уровня представления, но, учитывая ваш опыт, это может облегчить понимание статьи.

Я лично занимался той же разработкой, что и вы сейчас (winforms для клиента, WCF для уровня бизнес-логики, LINQ2SQL для доступа к данным), но, будучи в то время полным новичком в WCF и LINQ2SQL, я в основном вынужден был отказаться от оригинала. ценности удержания. Эта статья наиболее подходит для ваших нужд, хотя, честно говоря, я не видел ничего, что работало бы с использованием хранимых процедур.

1
alextansc 26 Май 2009 в 17:19
  • Откажитесь от sprocs и создайте новый файл DBML для своих таблиц.
  • Перетащите свои столы и бац! LinqToSql создаст для вас классы сущностей с методами обновления (создания и т. Д.).

LinqToSql имеет несколько подходов к параллелизму. Для одного из перегруженных методов Attach() (используемых для обновлений) требуются 2 параметра: исходная сущность и новая сущность. LinqToSql будет делать то, что раньше делал ObjectDataSource, сравнивать старые значения с новыми и генерировать исключения параллелизма (это даже значительно упрощает обработку исключений параллелизма. +10 .. но это не ваш вопрос).

Используйте эту ссылку, особенно нижний раздел под названием < strong> С полными объектами . Это имеет большой смысл и показывает, как используются различные подходы параллелизма и как обрабатывать исключения.

Весело провести время.

-1
Matt Kocaj 1 Июн 2009 в 09:00
Подразумевается, что звездочки необходимы, и от них нельзя отказаться.
 – 
Lucas
1 Июн 2009 в 19:01