2010-08-19 5 views
5

Для моего первичного ключа и идентификатора в нашей таблице клиентов я использую столбец uniqueidentifier со значением по умолчанию, установленным в newsequentialid(). Вставка новых строк через инструмент управления создает значения для тонкости идентификатора.Использование уникального типа столбца SQL с инфраструктурой Entity

Вставка из .NET 4 кода через результаты EF в нулевые идентификаторы GUID (00000-0000 ....). Я создаю объект с новым, устанавливаю некоторые значения и выполняю EF AddToClients (например). Если отлаживается, значение для свойства id показывает нулевой идентификатор GUID. Я не устанавливаю явно id через Guid.NewGuid() в свой код, потому что я хочу оставить его на newsequentialid() в SQL Server. Проблема в том, что она не работает. При первом запуске кода строка вставлена ​​с нулевым идентификатором GUID. В следующий раз, когда он явно терпит неудачу и приведет к исключению нарушения первичного ключа.

Как я могу заставить это работать без необходимости указывать GUID в моем клиентском коде?

ответ

10

Вам необходимо изменить значение StoreGeneratedPattern для свойства в дизайнере EF. Установите его на Identity. Это заставит EF избежать установки значения на вставке, а затем захватить его после завершения вставки.

Обратите внимание, что если вы используете EF 4, у вас могут возникнуть проблемы с использованием только конструктора (см. this link). Возможно, вам придется вручную отредактировать .edmx и установить StoreGeneratedPattern в самой модели хранилища.

+0

ли это. Без изменений. У объекта все еще есть ZERO GUID, установленный перед вставкой и вставкой с дублирующимся ключом (я оставил ранее вставленный в таблице). – mare

+0

Ох я вижу о проблемах дизайнера ... это просто здорово..Наверх другой вопрос, о котором я писал в другом вопросе, теперь это. Спасибо за ответ, хотя. – mare

+0

@mare: Я чувствую вашу боль.EF - мощный инструмент, но когда вы сталкиваетесь с чем-то, что он не обрабатывает * хорошо *, это может быть огромная головная боль, чтобы обойти его. –

0

Я столкнулся с этой проблемой. Это настоящая боль. Вот одна страница об этом, с комментариями от Microsoft - http://social.msdn.microsoft.com/Forums/en/adonetefx/thread/aecf14e3-e4c9-439b-88af-23d4353afb9d.

Моим обходным путем было создание хранимой процедуры для использования в INSERT. На этой странице есть информация о том, как это сделать - http://thedatafarm.com/LearnEntityFramework/tutorials/using-stored-procedures-for-insert-update-amp-delete-in-an-entity-data-model/. Пока у меня есть только вставка, хранимая proc - ничего для обновления или удаления; и вопреки статье, я не получаю ошибку проверки модели.

КОРРЕКЦИЯ EF позволяет мне получить список объектов, но когда я пришел, чтобы получить экземпляр определенного, я получил сообщение об ошибке, связанной с отсутствием функции сопоставления для обновлений. Тьфу!

Для извлечения вставленного UUID, созданного с помощью newsequentialid(), я использовал метод «OUTPUT INSERTED. [Column]», который был введен с SQL Server 2005. Пример: Retrieve last row inserted with Uniqueidentifier that it is not IDENTITY. Я использовал ту же технику в хранимой процедуре INSERT для извлечения столбцов datetime, которые были установлены с использованием getdate() по умолчанию.

Надеется, что это помогает кто-то,

Донни

+0

для обходного пути Я использовал функцию Guid.NewGuid() в своем коде, поэтому я просто генерирую GUID для своих новых объектов до вставки. Это не последовательный, но он работает, и он будет продолжать работать, когда изменения EF в будущих версиях. Влияние производительности должно быть низким для таблиц с несколькими сотнями записей. – mare

0

правой кнопке мыши в вас EDMX-. Открыть с текстовым редактором XML с кодировкой или другим. Найдите имя и добавьте атрибут рядом с ним в том же теге: StoreGeneratedPattern = "Identity".

Пример:

< Property Name = "WorkerId" Тип = "UniqueIdentifier" Nullable = "ложь" StoreGeneratedPattern = "Идентичность" />

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