Как засеять данные с помощью AddOrUpdate со сложным ключом в EF 4.3

101

Я пытаюсь заполнить базу данных разработки некоторыми тестовыми данными.

Я использовал context.People.AddOrUpdate(p => p.Id, people));с большим успехом.

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

Например, я хотел бы добавить AddOrUpdate на основе совпадения имени и фамилии.

Я не уверен, как правильно написать выражение.

context.People.AddOrUpdate(p => p.FirstName && p.LastName, people);

явно неверно, но я надеюсь, что он передает решение, которое я ищу.

Кейт Сирмонс
источник

Ответы:

200

Попробуй это:

context.People.AddOrUpdate(p => new { p.FirstName, p.LastName }, people);
Ладислав Мрнка
источник
12
@LadislavMrnka что, если идентификатор должен быть сложным типом, т.е. context.People.AddOrUpdate(p => new { p.Name.FirstName, p.Name.LastName }, people)?
gabe
3
@LadislavMrnka, а что, если свойство является типом, допускающим значение NULL? т.е. context.People.AddOrUpdate(p => new { p.Birthdate }, people)?
stack247 01
2
Здесь следует отметить, что коллекция «люди» должна быть ARRAY, а не списком. Если у вас есть список объектов, вы можете просто вызвать .ToArray () в списке. Я боролся с этим :) - Хороший ответ
Дин Мартин
1
не могу заставить это работать. возможно, потому что (в дополнение к 3 свойствам, указанным в составном ключе) у меня есть другое поле идентификатора с автоматически сгенерированными числами?
Sonic Soul,
@LadislavMrnka необходимо сохранить папку миграции (Configuration.cs и ...) после миграции и обновления полей базы данных ???
AminM
1

Если вы попали Only primitive types or enumeration types are supported in this context.из-за использования свойства навигации - рассмотрите возможность добавления свойства внешнего ключа непосредственно к сущности (возможно, только с помощью геттера) и используйте его, как предложил Ладислав Мрнка .

Люкер
источник
Как добавить в code firstподход свойство навигации другого внешнего ключа таблицы ? У меня структура нравится context.People.AddOrUpdate(p => new { p.Name.FirstName, p.Name.LastName }, people)? Это возможно
Йоген Дарджи
Если я установил ошибку свойства getterThe specified type member 'NameId' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
yogen darji