Ejemplo n.º 1
0
        public async Task <ActionResult <Project> > PatchAsync(string id, CancellationToken cancellationToken)
        {
            //3- 动态更新字段 利用反射
            var originProject = await _lighterDbContext.Projects.FirstOrDefaultAsync(p => p.Id == id, cancellationToken);

            if (originProject == null)
            {
                return(NotFound());
            }
            var properties = _lighterDbContext.Entry(originProject).Properties.ToList();

            foreach (var query in HttpContext.Request.Query)
            {
                var property = properties.FirstOrDefault(p => p.Metadata.Name == query.Key);
                if (property == null)
                {
                    continue;
                }

                var currentValue = Convert.ChangeType(query.Value.First(), property.Metadata.ClrType);
                _lighterDbContext.Entry(originProject).Property(query.Key).CurrentValue = currentValue;
                _lighterDbContext.Entry(originProject).Property(query.Key).IsModified   = true;
            }

            await _lighterDbContext.SaveChangesAsync();

            return(originProject);
        }
        public async Task<IActionResult> GetAsync(string id, CancellationToken cancellationToken)
        {
            //// 预先加载
            //var project = await _lighterDbContext.Projects.Include(p => p.Groups)
            //    .FirstOrDefaultAsync(p => p.Id == id, cancellationToken);

            // 显式加载
            var project = await _lighterDbContext.Projects.FirstOrDefaultAsync(p => p.Id == id, cancellationToken);
            await _lighterDbContext.Entry(project).Collection(p => p.Groups).LoadAsync(cancellationToken);

            //// 延迟加载
            //project.Groups// 引用到属性时才加载

            //foreach (var project in _lighterDbContext.Projects)
            //{
            //    project.Groups// 多次查询数据库
            //}

            //// 一次性查询
            //var projects = _lighterDbContext.Projects.ToList();

            return Ok(project);
        }