[英]EF6 write once to DB with FK relation
我想知道是否有可能在两个对象上一次写入数据库,而一个对象对另一个对象有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();
}
当然上述代码不起作用,因此为什么我要问是否有可能。 我的理论是,如果我分配整个团队对象,那可能可行吗? 例如:
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();
}
我尝试做的事情有可能吗?
EF(或任何ORM)的主要好处之一就是为您做到了。 您可以在内存中创建任意大的对象图,并通过一次SaveChanges()
调用将它们全部保存到多个表中。
您不能期望EF要做的就是创建一个将执行所有操作的SQL语句,但是尽管它将执行多个SQL语句,但仅需要一个SaveChanges()
。
这确实取决于您正确设置持久性模型。 我看不到您的任何特别错误(您可以在团队中添加虚拟的Player集合,尽管我认为这不是必需的)。
您的示例C4应该可以正常工作-不是吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.