我想知道是否可以在两个对象上写入一次数据库,其中一个对象具有另一个对象的FK。例如,假设数据库结构是:
C1
public class Team {
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id {get; set;}
}
public class Player {
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public Guid Id {get; set;}
public Guid TeamId {get; set;}
public virtual Team Team {get; set;}
}
现在我有一个可以创建球员和球队的课程。目前我这样做:
C2
public async Task<bool> CreateTeams(){
var teams = new List<Teams>();
while (i < 5){
var team = new Team();
teams.Add(team);
//Assume Db is being instantiated somewhere else in the code
Db.Teams.Add(team);
}
if(await Db.SaveChangesAsync() > 0){
foreach(var team in teams){
var player = new Player{
player.TeamId = team.Id;
}
Db.Players.Add(player);
}
await Db.SaveChangesAsync();
}
}
正如您所看到的,我正在进行两次数据库调用,以便能够创建5个团队,每个团队中有1个玩家。我想知道是否有更有效的方法来完成。是否可以通过单个数据库调用执行此操作,这可能是这样的?
C3
public async Task<bool> CreateTeams(){
while (i < 5){
var team = new Team();
//Assume Db is being instantiated somewhere else in the code
Db.Teams.Add(team);
Db.Players.Add(new Player {TeamId = team.Id});
}
await Db.SaveChangesAsync();
}
当然上面的代码不起作用,因此我问为什么它是否可能以某种方式。我理论上说如果我分配整个Team对象它可能有用吗?例如:
C4
public async Task<bool> CreateTeams(){
while (i < 5){
var team = new Team();
//Assume Db is being instantiated somewhere else in the code
Db.Teams.Add(team);
Db.Players.Add(new Player {Team = team});
}
await Db.SaveChangesAsync();
}
我试图以任何方式做到这一点吗?
答案 0 :(得分:2)
EF(或任何ORM)的主要好处之一就是完全适合您。您可以在内存中创建任意大的对象图,并通过一次SaveChanges()
调用将它们全部保存到多个表中。
您可以期望EF做的是创建一个可以完成所有这些操作的SQL语句,但是当它执行多个SQL语句时,只需要一个SaveChanges()
。
这取决于您是否正确设置了持久性模型。我无法看到你的任何特别的错误(你可以在团队中添加一个Player的虚拟集合,虽然我不认为这是必需的。)
你的例子C4应该工作 - 不是吗?