Параллельность с хранимыми процедурами Linq To Sql - PullRequest
2 голосов
/ 07 мая 2009

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

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

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

Ответы [ 3 ]

3 голосов
/ 28 мая 2009

Используете ли вы хранимые процедуры напрямую (через 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);
1 голос
/ 26 мая 2009

Не тот ответ, который вы, возможно, ищете, но, поскольку вы упомянули об использовании 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, я в основном был вынужден отбросьте первоначальные значения удержания. Эта статья наиболее соответствует вашим потребностям, хотя, если честно, я не видел ничего, что могло бы работать с использованием хранимых процедур.

0 голосов
/ 01 июня 2009
  • Откажитесь от sprocs и создайте новый файл DBML для ваших таблиц.
  • Перетащите свои столы и бац! LinqToSql создаст для вас классы сущностей с методами обновления (создания и т. Д.).

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

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

веселись.

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