Добавьте запись с предопределенным значением PK в Entity Framework 4.1 (POCO) - PullRequest
2 голосов
/ 29 июня 2011

Мне нужно воссоздать базу данных с точно такими же значениями, которые были изначально созданы.Поэтому мне нужно добавить записи с заранее заданным значением PK.В этом случае PK - это идентификатор в базе данных, и когда я пытаюсь определить его значение, он просто игнорируется, получая его значение из идентификатора.Ошибка не возникает, но значение PK, которое я предоставляю, игнорируется.

пример:

Category category = new Category()
                        {
                            CategoryID=1,
                            CategoryName="Beverages",
                            Description="Soft drinks, coffees, teas, beers, and ales"                              
                        };
ctx.Categories.Add(category);
ctx.SaveChanges();

Примечания:

  • Я использую POCO, сначала кодпоэтому у меня нет модели EDMX для настройки.
  • Я не хочу использовать ctx.Database.ExecuteSqlCommand().Я хочу поддерживать независимый от базы данных подход.

Ответы [ 2 ]

0 голосов
/ 08 октября 2011

Я не знаю, позволит ли ваш сценарий сделать это, но если вы определите составной ключ следующим образом:

modelBuilder.Entity<Category>().HasKey(s => new { s.CategoryID, s.Name });

(при использовании HasKey при запуске DbContext.OnModelCreating * метод 1007 * и сначала код EF 4.1), затем вы на самом деле можете контролировать, какие значения вставляются при сохранении объекта POCO в базе данных.

Я скажуоднако я согласен с Ладиславом в том, что значения первичных ключей, которые вы пытаетесь сохранить здесь, концептуально действительно больше похожи на данные, чем на идентификаторы записей, и должны рассматриваться как таковые.То есть, обрабатывайте их как просто поля данных и создайте новое поле первичного ключа в своем классе POCO для уникальной идентификации записей базы данных.например, для категории

public Int32 PK {get; set;}

и обязательно укажите, что это поле должно быть PK от OnModelCreating

modelBuilder.Entity<Category>().HasKey(c => c.PK)
0 голосов
/ 29 июня 2011

В этом случае PK является Identity

В этом случае вы никогда не должны вручную вставлять его значение.После того, как вы установите столбец в качестве идентификатора, БД должна отвечать за управление Id.Из-за этого нет возможности передать значение из EF (если вы не хотите нарушать другие функции).Необходимо использовать ExecuteSqlCommand и создать сложный SQL, который будет:

  • Включить идентификационную вставку для таблицы
  • Вставить запись
  • Отключить идентификационную вставку для таблицы

Вставка значения в столбец идентификаторов должна быть разрешена SET IDENTITY_INSERT tableName ON

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...