EF6使用FK关系向DB写入一次

时间:2016-01-19 21:42:27

标签: c# asp.net-mvc-5 entity-framework-6

我想知道是否可以在两个对象上写入一次数据库,其中一个对象具有另一个对象的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();
}

我试图以任何方式做到这一点吗?

1 个答案:

答案 0 :(得分:2)

EF(或任何ORM)的主要好处之一就是完全适合您。您可以在内存中创建任意大的对象图,并通过一次SaveChanges()调用将它们全部保存到多个表中。

您可以期望EF做的是创建一个可以完成所有这些操作的SQL语句,但是当它执行多个SQL语句时,只需要一个SaveChanges()

这取决于您是否正确设置了持久性模型。我无法看到你的任何特别的错误(你可以在团队中添加一个Player的虚拟集合,虽然我不认为这是必需的。)

你的例子C4应该工作 - 不是吗?