Использование уникального идентификатора типа столбца SQL с платформой Entity - PullRequest
5 голосов
/ 19 августа 2010

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

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

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

Ответы [ 3 ]

12 голосов
/ 19 августа 2010

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

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

0 голосов
/ 20 августа 2014

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

Пример:

0 голосов
/ 03 декабря 2010

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

ИСПРАВЛЕНИЕ EF позволил мне добраться до получения списка сущностей, но когда я пошел, чтобы получить экземплярконкретного, я получил ошибку об отсутствии функции отображения для обновлений.Тьфу!

Чтобы извлечь вставленный UUID, сгенерированный с помощью newsequentialid (), я использовал технику «OUTPUT INSERTED. [Column]», которая была представлена ​​в SQL Server 2005. Например, Получить последнийстрока вставлена ​​с уникальным идентификатором, что это не IDENTITY .Я использовал ту же технику в хранимой процедуре INSERT для извлечения столбцов даты и времени, которые были установлены с использованием getdate () по умолчанию.

Надеюсь, это кому-нибудь поможет,

Донни

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