【发布时间】:2013-12-15 16:04:01
【问题描述】:
我正在使用 EF 和 WebAPI 并尝试保存一个具有许多子属性(例如城市、国家等)的新对象。这些属性的数据是从外部源中提取的,但我想将它们与我的对象一起保存到我的数据库中以用于报告目的。出于这个原因,我需要首先检查与新父母一起传递的新孩子是否已经存在(请记住,它不是从我的数据库中提取的)。
如果我选择了一个我已经保存的城市,它会保存一个重复的行,因为传入的对象没有我的城市 ID,所以 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);
}
}
我需要从我的上下文中获取现有实体的 ID,但之后我无法附加并让 EF 知道它不需要为此项目创建新条目。
我是 EF 的新手,我一直在努力保存/更新任何具有子集合的实体。当事物与上下文相关联时,我似乎无法思考。
【问题讨论】:
-
您正在附加已跟踪的实体。只需获取父级并使用 parent.Childern.Add() 或 parent.ChildernId = id 添加子实体。我希望你没有在这里使用延迟加载。
-
使用
Any()比使用Count() > 0更好。Count()循环遍历整个集合,Any()没有谓词只是偷看第一个项目并返回。 -
谢谢。我已经更新了我的代码以使用 Any()。我仍然被困住了。如果我从我自己的数据源中提取子属性,这不会是一个大问题,但因为我基本上每次都发送一个“新”项目(即它还没有来自我的数据库的 ID) .对不起,如果这很愚蠢。我真的很难掌握 EF。
-
你的 country_code 在数据库中是否有唯一的约束?如果没有,我会尝试添加一个并再次使用附加。
-
为什么实体框架将现有对象重新插入到我的数据库中? msdn.microsoft.com/en-us/magazine/dn166926.aspx
标签: c# entity-framework