#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, пытаясь разобраться в этом, или сделать это в течение двадцати минут с помощью триггера.