Linq вставка в поле первичного ключа, что является автосинхронизация - PullRequest
4 голосов
/ 20 мая 2009

Я более или менее хочу сделать то, что предлагает этот вопрос. Как вручную установить поле Identity в LINQ-To-SQL (IDENTITY INSERT)

Однако я хочу объяснить. У меня есть клиент БД. Я загружаю Linq объекты отсюда и отправляю их через WCF. С другой стороны, я присоединяю их к контексту данных и размещаю их в таблице. Проблема в том, что у них будет установлен столбец Guid. Этот столбец помечен как автосинхронизация в DBML. Так что в случае вставки, Linq заставляет меня использовать новое значение. Я хотел бы, чтобы это сохранило мою ценность, когда мне это нужно.

Обновление 1

По сути, я хочу переключать параметры AutoSync и IsDbGenerated на лету программно.

[Column(Storage="_cName", 
        AutoSync=AutoSync.OnInsert, 
        DbType="UniqueIdentifier NOT NULL", 
        IsPrimaryKey=true, IsDbGenerated=true)]

Ответы [ 3 ]

1 голос
/ 21 мая 2009

Позвольте мне перефразировать вопрос: вы хотите использовать одинаковые определения объектов с обеих сторон, но с одной стороны вы хотите, чтобы идентификатор был сгенерирован, а с другой стороны, вы хотите, чтобы он был вставлен? Единственный известный мне способ сделать это - использовать метаданные на основе XML вместо атрибутов. К сожалению, насколько мне известно, визуальный конструктор DBML не поддерживает метаданные XML. Однако вы можете использовать инструмент SqlMetal для генерации XML, а затем изменить файл для использования на другой стороне веб-службы.

Вы можете начать использовать SqlMetal здесь: http://msdn.microsoft.com/en-us/library/bb386987.aspx

0 голосов
/ 21 мая 2009

Обязательно нужно смотреть свойство IsDbGenerated, а не автосинхронизация.

Я вижу, вы описали один сценарий, в котором вы хотите установить идентификатор в приложении. Есть ли на самом деле другой сценарий, когда вам нужно, чтобы он был автоматически сгенерирован базой данных? Если нет, вы можете просто установить IsDbGenerated = false и заполнить с помощью Guid.NewGuid () в службе WCF, если / когда у вас еще нет идентификатора от клиента.

Одним из преимуществ использования rowguid вместо столбца идентификаторов является то, что вам разрешено вставлять определенные значения в столбец rowguid, но это не обязательно. Вы можете сохранить столбец как rowguid с помощью DEFAULT NEWID (), но установите IsDbGenerated = false в вашем сервисе, и он все равно будет работать, пока вы не забудете заполнить ID.

0 голосов
/ 21 мая 2009

Вы не можете изменять атрибуты на лету без использования отражения. Вы можете сделать это другим способом, вручную написав код linq. Я бы не советовал менять атрибуты «на лету», они являются атрибутами по своему замыслу, и могут быть непредвиденные последствия для их изменения.

...