Я использую EF и WebAPI и пытаюсь сохранить новый объект с множеством дочерних свойств (например, город, страна и т. Д.). Данные для этих свойств извлекаются из внешнего источника, но я хочу сохранить их в своей базе данных вместе с моим объектом для целей отчетности. По этой причине мне нужно сначала проверить, существует ли новый дочерний элемент вместе с новым родителем (помните, что он не извлекается из моей базы данных).Entity Framework - Сохранение дочерних объектов
Если я выбрал, например, город, который я уже сохранил, он сохраняет повторяющуюся строку, потому что объект, который прошел, не имеет идентификатора моего города, поэтому EF считает, что это новый элемент.
Я попытался подключиться, если он уже находится в БД, но он не позволит мне подключиться. В нем говорится, что элемент уже отслеживается контекстом.
Вот мой код для проверки и сохранения одной из дочерних коллекций перед сохранением нового родителя.
foreach (HBCountry country in hbcampaign.HBTargetingSpec.HBCountries)
{
if (db.HBCountries.Any(c => c.country_code == country.country_code))
{
country.CountryID = db.HBCountries.Where(c => c.country_code == country.country_code)
.FirstOrDefault()
.CountryID;
db.HBCountries.Attach(country);
}
else
{
db.HBCountries.Add(country);
}
}
мне нужно, чтобы захватить идентификатор существующего объекта из моего контекста, но после этого я не могу приложить, и пусть EF знать, что это не нужно, чтобы создать новую запись для этого элемента.
Я довольно новичок в EF, и я постоянно борюсь с сохранением/обновлением любых объектов, у которых есть дочерние коллекции. Кажется, я не могу обдумать, когда что-то связано с контекстом, а когда нет и т. Д.
Вы прикрепление уже отслеживаются сущность. Просто получите родительский элемент и либо используйте parent.Childern.Add(), либо parent.ChildernId = id, чтобы добавить дочерний объект. Надеюсь, вы не используете Lazy Loading здесь. –
Лучше использовать 'Any()', чем 'Count()> 0'. 'Count()' цикл через всю коллекцию, 'Any()' без предиката просто заглядывает в первый элемент и возвращается. –
Спасибо. Я обновил свой код, чтобы использовать Any(). Я все еще застрял. Если бы я вытаскивал дочерние свойства из моего собственного источника данных, это не было бы большой проблемой, а потому, что я в основном отправляю «новый» элемент каждый раз (т. Е. Он еще не имеет идентификатора из моего БД) , Извините, если это очень глупо. Я действительно изо всех сил пытаюсь справиться с EF. – GooseZA