ObjectSet <t> .AddObject()与EntityCollection <t> .Add()</t> </t>

时间:2011-07-05 16:02:30

标签: c# .net linq entity-framework-4

假设我有两个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。

或者有没有更好的方式我没有看到?

谢谢!

2 个答案:

答案 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();