2

Мне нужно хранить большое количество пользовательских данных в базе данных, где каждый пользователь уже имеет идентификатор в качестве ключа. Однако эти пользователи из большего количества пользователей, поэтому идентификатор не увеличивается и не может быть автоматически сгенерирован. Мне нужно иметь возможность вручную установить идентификатор.Entity Framework 7 IDENTITY_INSERT

Есть ли простой способ сделать это?

+0

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

+0

Не можете ли вы просто войти в файл .edmx и установить SoreGeneratedPattern для этого свойства в «none»? Или я чего-то не хватает? – Dave

+0

@Dave Я не думаю, что EF7 использует файлы edmx – Jcl

ответ

6

Я сделал несколько тестов, и это, кажется, работает для меня на EF 7.0.0 rc1-финал:

modelBuilder.Entity<Foo>().HasKey(x => x.Id); 
modelBuilder.Entity<Foo>().Property(x => x.Id).ValueGeneratedNever();  

Мой тестовый код:

static void Main(string[] args) 
{ 
    using (var db = new FooContext()) 
    { 
     var myFoo = new Foo {Id = 1002, Descr = "Test"}; 
     db.Add(myFoo); 
     db.SaveChanges(); 
    } 
    using (var db = new FooContext()) 
    { 
     var myFoo = db.Foos.FirstOrDefault(x => x.Id == 1002); 
     Console.WriteLine($"id = {myFoo?.Id}, descrip = {myFoo?.Descr}"); 
    } 
} 

(полный программный код здесь: http://pastebin.com/hSs9HZCP)

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

Это код миграции генерируется:

migrationBuilder.CreateTable(
    name: "Foo", 
    columns: table => new 
    { 
     Id = table.Column<long>(nullable: false), 
     Descr = table.Column<string>(nullable: true) 
    }, 
    constraints: table => 
    { 
     table.PrimaryKey("PK_Foo", x => x.Id); 
    }); 
+1

Если поле базы данных было настроено как поле «Идентификация», установка «DatabaseGeneratedOption.None» не поможет. База данных по-прежнему не позволит вам указывать личность вручную. Вы должны разрешить IDENTITY INSERT на столе. Посмотрите на этот блог. http://blog.robertobonini.com/2014/10/09/entity-framework-with-identity-insert/ – jvanrhyn

+0

@jvanrhyn Вижу, я никогда не пробовал это лично. Я собираюсь сделать быстрый проект и проверить – Jcl

+0

Я сделал простой тест, и он работает для меня, просто синтаксис неверен для EF7 (это был EF6), я обновляю – Jcl