假设我有两个EntitySets,“Teams”和“Players”。
我正在为系统添加新的团队,为了争论,假设我从一个文件中添加了一千个团队(包含重复项)。
该系统包含100个团队。我的目标是避免重复,而不为每个添加的团队调用SaveChanges()。
该过程是查询newteam尚不存在,然后添加新团队(如果不存在)。
var team = (from t in context.Teams
where t.Name == newTeam.Name
select t).FirstOrDefault();
if (team==null)
--Add New Team
如果我使用context.Teams.AddObject(newTeam);
或context.AddObject("Teams",newTeam);
team.Count()将保持为100,如果再次运行查询,则var team将为null。
但是,如果我改为使用player.Teams.Add(newTeam);
来添加团队,那么一切都很完美,除了我必须让玩家添加NewTeam并且该玩家将成为所有新团队的成员。
致电player.Teams.Add(newTeam);
后
该查询将返回新团队。
var team = (from t in player.teams
where t.Name = newTeam.Name
select t).FirstOrDefault();
player.Teams.Count()
将增加一个。
在第一个示例context.Teams是ObjectSet<T>,
,而在player.Teams.Add Teams是EntityCollection<T>
。我认为这些行为会相同,但事实并非如此。
有没有办法让ObjectSet<T>
表现得像EntityCollection<T>
?我想在从文件中添加所有团队之后只调用一次SaveChanges。
或者有没有更好的方式我没有看到?
谢谢!
答案 0 :(得分:6)
没有办法让它们表现得一样。 ObjectSet
表示数据库查询,一旦您使用它,您始终会查询尚未出现新团队的数据库。 EntityCollection
是已加载实体的本地集合,如果您使用它,则会对应用程序内存进行查询。
通常使用EntityCollection
与维护单独的List<Team>
:
List<Team> teams = context.Teams.ToList();
var team = teams.FirstOrDefault(t => t.Name == newTeam.Name);
if (team == null)
{
context.Teams.AddObject(newTeam);
teams.Add(newTeam);
}
context.SaveChanges();
您还可以使用Dictionary<string, Team>
并获得更好的效果,而不是搜索每个团队的列表。
答案 1 :(得分:0)
“如果我使用context.Teams.AddObject(newTeam);或context.AddObject(”Teams“,newTeam)添加;
team.Count()将保持为100,如果再次运行查询,var团队将为null。“
在调用SaveChanges()方法之前,不会添加团队。
我猜测通过添加到Player表Navigation属性,它实际上是在调用SaveChanges()方法之前写入Team表。
我会考虑将所有新的团队放在一个列表中,然后在该列表上运行一个独特的团队。也许是这样的......
//an array of the new teams
var newTeams = {"Chi","Cle","La","Ny"};
//a list of the teams in the database
var teamsInDb = context.Teams.ToList();
//a query to get the unique teams that are not in the database
var uniqueTeams = newTeams.Where(t => !teamsInDb.Contains(t)).Distinct();
//iterate the new teams and add them
foreach(var t in uniqueTeams)
{
context.Teams.AddObject(t);
}
//save
context.SaveChanges();