2013-07-09 4 views
0

У меня есть таблица на SQL Server, и я использую Entity Framework для работы с базой данных SQL Server. Я хочу зарезервировать код для новой записи (новый объект таблицы), когда пользователь нажимает кнопку, чтобы добавить новую запись в таблицу перед сохранением записи, поэтому, когда другой пользователь нажимает кнопку, чтобы добавить новую запись, новый код (последний код + 1) зарезервирован для него перед сохранением записи.Зарезервируйте код для новой записи

Как это реализовать в C# и Entity Framework? Есть идеи?

+1

Что вы подразумеваете под кодом? Вы хотите сказать, что хотите сохранить значение PK для записи, прежде чем вставлять ее? – Jim

+0

@ Jim Нет кода - это другое поле в моей таблице –

+0

Если вы используете SQL Server ** 2012 **, вы можете посмотреть на ['SEQUENCE'] (http://msdn.microsoft.com/ru -us/library/ff878091.aspx), чтобы достичь этого. В противном случае вам придется подождать, пока строка ** IS ** не будет вставлена ​​и не будет использоваться столбец «INT IDENTITY», который автоматически получает значение при вставке. –

ответ

2

@ Ответ Jean-Bernard Pellerin определенно будет работать. Но то, что мне не нравится в этом подходе, состоит в том, что все столбцы, кроме идентификатора, должны иметь значение NULL или иметь значения по умолчанию, которые могут не иметь смысла для объекта. Из-за этого я стараюсь не требовать резервирования кода или идентификатора для объекта до его создания.

Но иногда вы не можете этого избежать. В этом случае я разделил объект на два разных объекта - один для фактического объекта, а другой - для отслеживания процесса его создания. Например, если ваша запись является объектом Record, у вас также будет объект RecordCreation. RecordCreation имеет свойство для вашего зарезервированного значения кода, а также имеет свойство DateTime с нулевым значением с именем DateComplete. Когда вы идете создать новый объект, вы фактически создаете объект RecordCreation и задаете его значение кода - это сохраняет его код. Затем, когда вы будете готовы создать реальный объект, вы также обновите столбец DateComplete. Это имеет ряд преимуществ:

  1. У вас нет частично завершенных объектов, которые никогда не заканчивались, создавая вашу базу данных.
  2. У вас есть запись о попытках создать сущность, которая никогда не завершалась, и у вас есть запись о попытках, которые преуспели.

Если вы думаете об этом, эти сущности действительно служат двум отдельным деловым целям. Поэтому имеет смысл иметь две сущности.

Заключительное примечание. Конечно, вы можете просто удалить объект RecordCreation после завершения объекта Record. Но тогда у вас нет регистрации, поэтому устранение неполадок приложения сложнее. Я предпочитаю отмечать его датой.

0

Когда пользователь начинает создавать новый элемент, добавьте его в базу данных.
Заполните одно из полей с помощью GUID или еще что-то подобное.
Посмотрите на пункт с соответствующим GUID и получите его код.
Это ваш зарезервированный код.

Когда пользователь готов к сохранению, просто обновите существующую запись заполнителя.
Не забудьте удалить местозаполнитель, если пользователь отменяет создание.

0

Для этого я бы использовал «семенной стол». Когда вы «резервируете» новый код, увеличьте начальное значение на 1 и верните результат. Хотите ли вы добавлять объекты для этого или просто использовать SQL, зависит от вас. Я лично просто использовал SQL, чтобы уменьшить риск получения двух запросов на один и тот же код. Если вы все это в SQL вы можете виртуально elimitate, выполнив выбор и обновление в одном заявлении:

DECLARE @newID int 

UPDATE SeedTable 
SET NextID = NextID + 1, 
    @newID = NextID 

SELECT @newID, * FROM SeedTable 

Поскольку выбор и обновление происходит в одном заявлении вы должны быть защищены от одновременных запросов.

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

Смежные вопросы