CkH*_*CkH 4 .net c# linq entity-framework-4
假设我有两个EntitySets,"团队"和"玩家".
我正在为系统添加新的团队,为了争论,让我说我从一个文件中添加了一千个团队(包含重复项).
该系统包含100个团队.我的目标是避免重复,而不为每个添加的团队调用SaveChanges().
该过程是查询newteam尚不存在,然后添加新团队(如果不存在).
var team = (from t in context.Teams
where t.Name == newTeam.Name
select t).FirstOrDefault();
if (team==null)
--Add New Team
Run Code Online (Sandbox Code Playgroud)
如果我添加使用context.Teams.AddObject(newTeam);或context.AddObject("Teams",newTeam);
team.Count()将保持为100,如果再次运行查询,var团队将为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();
Run Code Online (Sandbox Code Playgroud)
player.Teams.Count() 会增加一个.
在第一个示例context.Teams是一个,ObjectSet<T>,而在,player.Teams.Add Teams是一个EntityCollection<T>.我认为这些行为会相同,但事实并非如此.
有没有办法使ObjectSet<T>表现像EntityCollection<T>?我想在从文件中添加所有团队之后只调用一次SaveChanges.
还是有更好的方式,我没有看到?
谢谢!
没有办法让它们表现得一样.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();
Run Code Online (Sandbox Code Playgroud)
您还可以使用Dictionary<string, Team>并获得更好的性能,而不是搜索每个团队的列表.
| 归档时间: |
|
| 查看次数: |
4881 次 |
| 最近记录: |