zoukankan      html  css  js  c++  java
  • 7、Entity Framework Core 3.1入门教程-添加关系数据

    本文章是根据 微软MVP solenovex(杨旭)老师的视频教程编写而来,再加上自己的一些理解。
    视频教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR
    GitHub源码:https://github.com/hllive/LearnEFCore3.1

    1、添加多个关系数据

    第3章第2节-表之间关系可以看出
    一个联赛拥有多个俱乐部,联赛(League)和俱乐部(Club)是一对多关系,
    一个俱乐部拥有多个队员,俱乐部(Club)和队员(Player)是一对多关系。
    首先添加一个俱乐部,俱乐部应该是添加到一个现有的联赛中。可以先查出来一个联赛,然后在联赛中添加一个俱乐部。
    通过3个Model可以看出,联赛(League)中体现不出联赛与俱乐部之间的关系,而在俱乐部(Club)中有联赛(League)的导航属性,这样就可以把一个Club中的League属性设为已知的League,这样就把club和league关联起了。

    举个例子更清晰:现在有个联赛叫《第一季度足球联赛》,邀请全国所有地区的足球队参加;看到邀请后,新成立一个俱乐部叫《新智联足球队》,成立俱乐部后需要队员加入啊,这里就添加了两个队员(王建国和李刚)

    [HttpPost("Club")]
    public IActionResult SaveClub()
    {
        //1、通过邀请码获取一个联赛,叫《第一季度足球联赛》
        League league = _dbContext.Leagues.SingleOrDefault(l => l.Id == new Guid("4227506d-05e4-47a2-b94f-08d8451d5dc00"));
        //2、创建一个俱乐部
        var club = new Club
        {
            //3、将获取的联赛添加到俱乐部中
            League = league,//这样League和Club就关联上了
            //4、设置其他属性
            Name = "新智联足球队",
            City = "贵州省贵阳市",
            DateOfEstablishment = new DateTime(2020, 8, 23),
            History = "参加很多比赛",
            //5、添加队员
            Players=new List<Player>() { 
                new Player{ Name="王建国",Birth=new DateTime(1994,8,2) },
                new Player{ Name="李刚",Birth=new DateTime(1994,9,25) }
            }
        };
        //添加和保存
        _dbContext.Clubs.Add(club);
        int count = _dbContext.SaveChanges();
        return Ok(count);
    }
    

    通过dbContext中DbSet的Add()方法把新成立的俱乐部添加到Context中,这样Context就知道已经新添加了一个Club,然后调用SaveChange()方法就会执行数据库的Insert语句

    最终这个例子需要了解League和Club怎么关联,Playe和Club怎么关联

    再查看一个例子

    [HttpPost("GamePlayer")]
    public IActionResult GamePlayer()
    {
        //1、查询符合添加的队员
        var players = _dbContext.Players.Where(p => p.Birth > new DateTime(1995, 1, 1)).ToList();
        //2、创建比赛对象
        var game = new Game { 
            Round = 2,
            StartTime = new DateTime(2020, 5, 1),
            //3、将查询出来的队员集合与比赛建立关系
            GamePalyers = players.Select(p => new GamePlayer { Player = p }).ToList()
        };
        //添加和保存
        _dbContext.Games.Add(game);
        int count = _dbContext.SaveChanges();
        return Ok(count);
    }
    

    2、添加单个关系数据

    再看一个例子:现在俱乐部成立后才两个队员,需要再添加队员;那么添加单个队员怎么添加呢?请看代码

    先从数据库中把俱乐部查出来,由于俱乐部里有一个Players集合属性导航,可以通过这个Players中的Add()方法来添加新的队员。而俱乐部被contact变化追踪的,所以添加一个新的队员,context就知道这个队员是新加的。并且不用设定外键,然后呢,我们SaveChange就可以了,因为context会把这些变化都了解到,然后计算出来应该执行哪些sql语句。

    [HttpPost("Palyer")]
    public IActionResult AddPalyer() {
        //1、查询出俱乐部
        var club = _dbContext.Clubs.SingleOrDefault(l => l.Name == "新智联足球队");
        //2、在俱乐部中添加队员
        club.Players.Add(new Player() { Name = "张全蛋", Birth = new DateTime(1999, 12, 1) });
        //3、保存数据
        int count = _dbContext.SaveChanges();
        return Ok(count);
    }
    

    3、Attach的使用

    首先通过一个例子可以看出,《1、查询出俱乐部(不追踪)》就相当于是离线数据,不被context追踪,使用离线数据需要使用Update方法;在使用Update的时候Context发现在俱乐部中新添加了一个队员。

    [HttpPost("UseAttach")]
    public IActionResult UseAttach()
    {
        //1、查询出俱乐部(不追踪)
        var club = _dbContext.Clubs.AsNoTracking().SingleOrDefault(x => x.Name == "新智联足球队");
        //2、在查询出来的俱乐部中添加新队员
        club.Players.Add(new Player { Name = "陈浩杰", Birth = new DateTime(2000, 5, 6) });
        //3、使用Update更新数据
        _dbContext.Clubs.Update(club);//离线数据需要使用Update方法
        //4、保存数据
        int count = _dbContext.SaveChanges();
        return Ok(count);
    }
    


    使用SaveChange()执行的SQL语句里包括查询Club、更新Club和添加Player的操作,使用Update()方法会把俱乐部所有属性值重新更新一下;
    我们只是想添加一个新队员,但是把俱乐部(Club)所有的属性都更新了一遍。这种情况怎么办呢?

    使用Attach附加方法,在Club上附加对象,这时候Club是未修改状态,context不会进行修改操作,但是发现在Player导航属性中新添加了一个队员,context会对新添加的队员生成SQL语句;说明在Club上附加了一个新队员,所以生成SQL语句的时候只插入了队员的数据,Club和Player之间的关系也会自动生成

    在上面的例子中,只需要把Update()方法修改为Attach()方法即可

    [HttpPost("UseAttach")]
    public IActionResult UseAttach()
    {
        //1、查询出俱乐部(不追踪)
        var club = _dbContext.Clubs.AsNoTracking().SingleOrDefault(x => x.Name == "新智联足球队");
        //2、在查询出来的俱乐部中添加新队员
        club.Players.Add(new Player { Name = "陈浩杰", Birth = new DateTime(2000, 5, 6) });
        //3、使用Update更新数据
        //_dbContext.Clubs.Update(club);//离线数据需要使用Update方法
        _dbContext.Clubs.Attach(club);//附加对象
        //4、保存数据
        int count = _dbContext.SaveChanges();
        return Ok(count);
    }
    

    最后来看三个方法调用效果

    博客文章可以转载,但不可以声明为原创

  • 相关阅读:
    060821流水账
    060721流水账
    060421流水账
    [Tips] 更新oh my zsh
    [Tips] updraftplus备份wordpress
    [Tips] SSH免密登陆
    [Notes] 基于阿里云的SSL在容器化wordpress中部署https服务
    [Tips] wordpress添加文章计数
    [Notes] 容器化部署wordpress
    [Notes] pandas 保存hdf5时numpy array遇到的性能warning
  • 原文地址:https://www.cnblogs.com/hllive/p/13551114.html
Copyright © 2011-2022 走看看