Установите пользовательское значение идентификатора в поле автоматического увеличения

#sql-server #entity-framework #linq-to-entities #identity #auto-increment

#sql-сервер #entity-framework #linq-to-entities #идентификатор #автоматическое увеличение

Вопрос:

У меня в моей базе данных (Sql server 2008) есть столбец идентификатора с автоматической установкой числового значения. Я использую EF и linq2entities

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

Может быть, это немного странно, но возможно ли это сделать с помощью linq2entities?

Заранее спасибо!

Ответ №1:

Я считаю, что это невозможно, если нет какого-либо способа отключить «SET Identity_Insert TableName ON» в Entity Framework.

В принципе, в SQL Server, когда вы отправляете идентификатор в поле, его нельзя заполнить вручную, если вы не выполните следующую инструкцию

 SET Identity_Insert TableName ON
  

После выполнения этой инструкции вы сможете заполнить поля идентификатора вручную.

Единственные другие варианты, которые я могу придумать, это удалить атрибут Identity из столбца и создать свой собственный incrementer для поля в Entity Framework с использованием частичного класса

Что-то вроде этого

 public partial class EntityClassName : global::System.Data.Objects.DataClasses.EntityObject, IEntity
{
    partial void InitializeFields();

    Int64 IEntity.IdentityColumn
    {
        get { return IdentityColumn; }
        set { //some code for an incrementer 
              //and the ability to set manually 
              //if value provide is not null
            }
    }

}
  

Комментарии:

1. Я предполагал, что «прямого» решения не существует. Спасибо за подход, я думаю, мне пришлось бы изменить свою логику, чтобы она была простой

Ответ №2:

Я не хотел бы прямо говорить, что это невозможно, но это вполне по-бейсбольному для L2E. Но это довольно простой триггер ВСТАВКИ. Вы получите вставленную строку через INSERTED (Google объяснит), а затем обновите эту строку с помощью любой безумной логики, которую захотите.

Я думаю, вы можете часами биться головой о L2E, пытаясь разобраться в этом, или сделать это в течение двадцати минут с помощью триггера.