У меня есть EF 6.x, несколько сущностей и с полем Id у каждой (типа Guid), которые сконфигурены как
Property(e => e.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
Я получаю данные при синхронизации с сервером и мне требуется сохранять модели с серверными идентификаторами у себя в базе.
Но, к сожалению, единственный метод,который я нашел - это создания нового контекста, но этот метод мне крайне нежелательный.
Так же нашел варианты, где предлагают поставить DatabaseGeneratedOption.None и задать дефолтное значение для филда, но оно тоже не подходит, т.к. primary key не может быть null.
P.S. SET IDENTITY_INSERT тоже не подходит.
Спасибо за любые ответы!
Вы пытаетесь решать две задачи разными способами одновременно - потому и не получается. С одной стороны вам надо чтобы Id генерировались в базе при создании новой записи (потому и DatabaseGeneratedOption.Identity) - с другой, вам надо чтобы вы могли их задавать сами (потому и DatabaseGeneratedOption.None).
Так вот - Entity Framework так не умеет.
Вариант с Identity исключает вставку своих значений в принципе. EF даже не пытается передавать их в БД (потому и IDENTITY_INSERT не срабатывает).
Поэтому вам нужен вариант с None. А чтобы база данных не жаловалась что "primary key не может быть null" - не забывайте заполнять это поле! Когда вы делаете первичный ключ с атрибутом DatabaseGeneratedOption.None - вы сообщаете EF что вы всегда будете указывать его значение. Вот и создавайте его через Guid.NewGuid().
Сборка персонального компьютера от Artline: умный выбор для современных пользователей