ObjectSet <T> .AddObject()与EntityCollection <T> .Add()

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.

还是有更好的方式,我没有看到?

谢谢!

Lad*_*nka 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();
Run Code Online (Sandbox Code Playgroud)

您还可以使用Dictionary<string, Team>并获得更好的性能,而不是搜索每个团队的列表.