Я пришел из мира asp.net, где мы бы использовали источник данных объекта, подключились к уровню доступа к данным и установили его свойство ConflictDetection на «CompareAllValues». В ObjectDataSource есть OldValuesParameterFormatString, который вы используете для определения параметров старых значений.
Процедура sql, которая выполняет обновление, потребует как новых, так и старых параметров, и все… Очень просто реализовать; ODS обработал старые значения за вас.
Я перешел с Linq на SQL и WinForms. Я создал службу WCF, которая является нашим бизнес-уровнем, и у меня есть хранимая процедура, которая обновляет некоторую таблицу. В конструкторе контекста данных я вижу, что в столбцах моего класса есть свойство «Проверка обновлений». Я не обновляю таблицу напрямую из класса, а вызываю хранимую процедуру для обновления. Есть ли способ сохранить исходные значения, возможно, из контекста данных, аналогично тому, как это сделал бы источник данных объекта?
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);
Это не тот ответ, который вы, возможно, ищете, но поскольку вы упомянули об использовании WCF в качестве бизнес-уровня вместе с LINQ2SQL, я счел своим долгом указать на эту статью для справки:
Хотя в статье ASP.NET реализован в качестве основного уровня представления, но, учитывая ваш опыт, это может облегчить понимание статьи.
Я лично занимался той же разработкой, что и вы сейчас (winforms для клиента, WCF для уровня бизнес-логики, LINQ2SQL для доступа к данным), но, будучи в то время полным новичком в WCF и LINQ2SQL, я в основном вынужден был отказаться от оригинала. ценности удержания. Эта статья наиболее подходит для ваших нужд, хотя, честно говоря, я не видел ничего, что работало бы с использованием хранимых процедур.
- Откажитесь от sprocs и создайте новый файл DBML для своих таблиц.
- Перетащите свои столы и бац! LinqToSql создаст для вас классы сущностей с методами обновления (создания и т. Д.).
LinqToSql имеет несколько подходов к параллелизму. Для одного из перегруженных методов Attach()
(используемых для обновлений) требуются 2 параметра: исходная сущность и новая сущность. LinqToSql будет делать то, что раньше делал ObjectDataSource
, сравнивать старые значения с новыми и генерировать исключения параллелизма (это даже значительно упрощает обработку исключений параллелизма. +10 .. но это не ваш вопрос).
Используйте эту ссылку, особенно нижний раздел под названием < strong> С полными объектами . Это имеет большой смысл и показывает, как используются различные подходы параллелизма и как обрабатывать исключения.
Весело провести время.
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.