繁体   English   中英

EF6与FK关系一次写入数据库

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM