2016-11-30 4 views
1

Я сделал несколько таблиц в EF и ввел некоторые семенные данные, где я даю значение нескольким столбцам с первичным ключом. Когда я запускаю приложение, я получаю сообщение об ошибке:Как включить идентификатор-вставьте в .net-ядро

Невозможно вставить явное значение для столбца идентификации в таблице «Персоны», если для параметра IDENTITY_INSERT установлено значение «ВЫКЛ».

Как включить его? Я читал здесь, чтобы использовать:

[DatabaseGeneratedAttribute (DatabaseGeneratedOption.Identity)]

над тем свойством, что является первичным ключом. К сожалению, я все еще получаю такое же сообщение об ошибке. Пожалуйста помоги.

Update *

Я добавил [DatabaseGenerated (DatabaseGeneratedOption.None)] для всех моих свойств, которые имеют первичный ключ. Когда я запускал миграцию, я вижу, что столбец идентификатора удален, но я все равно получаю то же сообщение об ошибке.

Когда я перехожу к SQL-поиску, я все еще вижу столбец идентификаторов на своем первичном ключе. Я попробовал обновить базу данных. Что я делаю не так? Единственное, что я могу сделать, это войти в свойства и удалить личность, но почему я не могу сделать это так, как это было упомянуто выше? Пожалуйста помоги.

+0

https://docs.microsoft.com/en-us/ef/core/index –

+0

Вы хотите, чтобы столбец первичного ключа никогда не быть столбцом идентификаторов, или просто временно отключить его идентичность-Несс, чтобы вы может вручную назначить некоторые ключевые значения для нескольких записей? –

+0

Оператор SQL, чтобы отключить IDENTITY_INSERT, является 'SET IDENTITY_INSERT [dbo]. [Mytable] OFF', если ваше имя таблицы' mytable', а ваша схема - 'dbo'. Причиной отключения IDENTITY_INSERT является запрет вручную устанавливать значение для первичного ключа. – kimbaudi

ответ

4

В EF Core 1.1.2 я получил это для работы с транзакциями. В моем «инициализаторе базы данных», который помещает данные семян в таблицы. Я использовал технику от this EF6 answer. Вот пример кода:

using (var db = new AppDbContext()) 
using (var transaction = db.Database.BeginTransaction()) 
{ 
    var user = new User {Id = 123, Name = "Joe"}; 
    db.Users.Add(user); 
    db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT MyDB.Users ON;"); 
    db.SaveChanges(); 
    db.Database.ExecuteSqlCommand("SET IDENTITY_INSERT MyDB.Users OFF"); 
    transaction.Commit(); 
} 
0

Другой способ заключается в четком открыть соединение затем SET IDENTITY_INSERT <table> ON.

var conn = context.Database.GetDbConnection(); 
if (conn.State != ConnectionState.Open) 
    conn.Open(); 

context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT Posts ON"); 

var post = new WeblogPost() 
{      
       Id= oldPost.Pk, // <!--- explicit value to Id field 
       Title = oldPost.Title, 
       ... 
}; 
context.Posts.Add(post);  
conn.Close(); 

Видимо, как только соединение было явно открыто до того запроса EF, что соединение не закрывается автоматически при EF, поэтому установка применяется в том же контексте соединения.

Это по той же причине, что ответ Стива с транзакциями работает как транзакции, сохраняющие связь.

Примечание: вы не хотите, чтобы поставить соединение в using заявление если вы планируете использовать один и тот же контекст позже в прикладном/запроса. Соединение должно существовать, поэтому лучший способ очистить контекст соединения - это .Close(), тем самым возвращая EF к по умолчанию для открытия и закрытия соединения для каждой операции.

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