Мне нужно загрузить записи из существующей базы данных в новую базу данных, используя запрос LINQ, используя LINQPad.Если запись существует в базе данных, обновите имя.В противном случае вставьте запись.В настоящее время новая БД пуста.Этот скрипт будет запускаться периодически, поэтому я должен проверять наличие обновлений.У меня есть код, который загружает существующие и новые записи в два списка для сравнения.Я перебираю список:
foreach (Coaster oldCoaster in listOfOldCoasters) {
var coaster = listOfNewCoasters.Where(c => c.coasterId == oldCoaster.coasterId).FirstOrDefault();
if (coaster != null) {
coaster.Name = oldCoaster.Name;
} else {
coaster = new Models.Coaster();
coaster.CoasterId = oldCoaster.coasterId;
coaster.Name = oldCoaster.Name;
//newCoasterDbContext.Coasters.Attach(coaster);
newCoasterDbContext.Coasters.Add(coaster);
}
}
newCoasterDbContext.SaveChanges();
Когда я запускаю код с помощью метода «Добавить», я получаю исключение «OriginalValues нельзя использовать для сущностей в состоянии« Добавлен ».»Копая глубже, я вижу это сообщение:
Cannot insert the value NULL into column 'CoasterId', table 'Coaster'; column does not allow nulls.
Я задаю первичный ключ, о котором идет речь, поэтому я, должно быть, что-то упускаю из EF, почему это не удается.Если я раскомментирую оператор «Attach» и попробую его вместо «Add», сценарий запустится, но в базу данных ничего не будет вставлено.
Класс My Coaster:
public class Coaster
{
public System.Guid CoasterId { get; set; }
public string Name { get; set; }
public Coaster()
{
CoasterId = System.Guid.NewGuid();
}
}
На основена других постах я пытался добавить атрибуты к PK:
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
И я пытался изменить метод OnModelCreating:
HasKey(x => x.CoasterId).Property(x => x.CoasterId).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
Это не помогло мне.Что я упустил, что заставляет Entity Framework игнорировать GUID, который я прикрепил к полю первичного ключа?