Как засеять данные с помощью 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.