Exemple #1
0
        public Character QueryById(Guid id)
        {
            var dbCharacter =
                Characters
                .AsNoTracking()
                .Include(x => x.Friends)
                .Include(x => x.Episodes)
                .FirstOrDefault(x => x.Id == id);

            if (dbCharacter is null)
            {
                return(null);
            }
            return
                (new Character
            {
                Id = dbCharacter.Id,
                Name = dbCharacter.Name,
                Episodes =
                    new Episodes(dbCharacter.Episodes
                                 .Select(y => y.Episode)
                                 .ToArray()),
                Friends =
                    new Friends(dbCharacter.Friends
                                .Select(y => new Friend
                {
                    Id = y.FriendId,
                    Name = y.FriendName
                })
                                .ToArray())
            });
        }
        public void InsertUpdateOrDeleteGraph(object entity)
        {
            ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

            if (entity is Character character)
            {
                var existing = Characters
                               .AsNoTracking()
                               .Include(c => c.FunctionKeys)
                               .Include(c => c.Inventories)
                               .ThenInclude(c => c.Items)
                               .Include(c => c.SkillRecords)
                               .FirstOrDefault(c => c.ID == character.ID);

                if (existing != null)
                {
                    foreach (var functionKey in existing.FunctionKeys)
                    {
                        if (character.FunctionKeys.All(f => f.ID != functionKey.ID))
                        {
                            Entry(functionKey).State = EntityState.Deleted;
                        }
                    }

                    var existingItems = existing.Inventories.SelectMany(i => i.Items).ToList();
                    var currentItems  = character.Inventories.SelectMany(i => i.Items).ToList();

                    foreach (var existingItem in existingItems)
                    {
                        if (currentItems.All(i => i.ID != existingItem.ID))
                        {
                            Entry(existingItem).State = EntityState.Deleted;
                        }
                    }

                    foreach (var skillRecord in existing.SkillRecords)
                    {
                        if (character.SkillRecords.All(s => s.ID != skillRecord.ID))
                        {
                            Entry(skillRecord).State = EntityState.Deleted;
                        }
                    }
                }
            }
        }
Exemple #3
0
        public (Characters data, int pageNr, int charactersCount) QueryPaginated(PaginationOptions paginationOptions)
        {
            int count    = Characters.Count();
            int lastPage = 0;
            int pageSize = paginationOptions.PageSize < 1 ? 1 : paginationOptions.PageSize;

            if (count % pageSize != 0)
            {
                lastPage = count / pageSize + 1;
            }
            else
            {
                lastPage = count / pageSize;
            }

            int pageNr = lastPage < paginationOptions.PageNumber?lastPage:paginationOptions.PageNumber;

            return(
                new Characters(
                    Characters.AsNoTracking().Include(x => x.Friends).Include(x => x.Episodes)
                    .Skip(pageSize * (pageNr - 1))
                    .Take(pageSize)
                    .Select(x => new Character
            {
                Id = x.Id,
                Name = x.Name,
                Episodes =
                    new Episodes(x.Episodes
                                 .Select(y => y.Episode)
                                 .ToArray()),
                Friends =
                    new Friends(x.Friends
                                .Select(y => new Friend
                {
                    Id = y.FriendId,
                    Name = y.FriendName
                })
                                .ToArray())
            })
                    .ToArray())
                , pageNr, count);
        }
Exemple #4
0
 public Characters Query()
 {
     return
         (new Characters(
              Characters.AsNoTracking().Include(x => x.Friends).Include(x => x.Episodes)
              .Select(x => new Character
     {
         Id = x.Id,
         Name = x.Name,
         Episodes =
             new Episodes(x.Episodes
                          .Select(y => y.Episode)
                          .ToArray()),
         Friends =
             new Friends(x.Friends
                         .Select(y => new Friend
         {
             Id = y.FriendId,
             Name = y.FriendName
         })
                         .ToArray())
     })
              .ToArray()));
 }
Exemple #5
0
 public async Task <IEnumerable <Сharacter> > GetCharactersWithGuns()
 {
     return(await Characters.AsNoTracking().Include(b => b.AviableGuns).ToListAsync());
 }
Exemple #6
0
 public async Task <IEnumerable <Сharacter> > GetCharacters()
 {
     return(await Characters.AsNoTracking().ToListAsync());
 }
Exemple #7
0
        public override int SaveChanges()
        {
            try
            {
                var aliasChangeSet = ChangeTracker.Entries <Character>();
                if (aliasChangeSet != null)
                {
                    foreach (var entry in aliasChangeSet.Where(x => x.State != EntityState.Unchanged))
                    {
                        var query =
                            from s in Servers
                            join a in Characters on s.ID equals a.Server.ID
                            where a.ID == entry.Entity.ID
                            select s;
                        var server = query.AsNoTracking().SingleOrDefault();

                        if (server == null)
                        {
                            continue;                 // Seeding
                        }
                        var na = Characters.AsNoTracking().SingleOrDefault(x => (x.Server.ID == server.ID || x.Server.DiscordID == 0) && x.Alias.Equals(entry.Entity.Alias));
                        if (na != null && na.ID != entry.Entity.ID)
                        {
                            throw new ValidationException($"there is already a character registered with the alias '{na.Alias}'. Pick something else.");
                        }
                    }
                }

                var userChanges = ChangeTracker.Entries <User>().Where(x => x.State != EntityState.Unchanged).ToList();
                if (userChanges != null)
                {
                    for (int i = 0; i < userChanges.Count; i++)
                    {
                        userChanges[i].Entity.LastUpdate = DateTime.UtcNow;
                    }
                }

                var res = base.SaveChanges();

                return(res);
            }
            catch (DbUpdateException e)
            {
                //This either returns a error string, or null if it can’t handle that error
                var error = SaveChangesExceptionHandler(e, this);
                if (error != null)
                {
                    Console.WriteLine(error); //return the error string
                }
                else
                {
                    Console.WriteLine($"That's a database exception I don't know what to do with: {e.Message}");
                }
                throw; //couldn’t handle that error, so rethrow
            }
            catch (Exception e)
            {
                if (e is ValidationException)
                {
                    Console.WriteLine($"{(e as ValidationException).ValidationAttribute} with value {(e as ValidationException).Value} failed: {(e as ValidationException).ValidationResult}\n{e.Message}\n{e.StackTrace}");
                }
                else
                {
                    Console.WriteLine($"Exception in SaveChanges: \n{e.Message}\n{e.StackTrace}");
                }
                var inner = e.InnerException;
                while (inner != null)
                {
                    if (e is ValidationException)
                    {
                        Console.WriteLine($"{(e as ValidationException).ValidationAttribute} with value {(e as ValidationException).Value} failed: {(e as ValidationException).ValidationResult}\n{e.Message}\n{e.StackTrace}");
                    }
                    else
                    {
                        Console.WriteLine($"Exception in SaveChanges: \n{e.Message}\n{e.StackTrace}");
                    }
                    inner = inner.InnerException;
                }
                throw;
            }
        }
Exemple #8
0
        public void InsertUpdateOrDeleteGraph(object entity)
        {
            ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking;

            if (entity is Character character)
            {
                var existing = Characters
                               .AsNoTracking()
                               .Include(c => c.Inventories)
                               .ThenInclude(c => c.Items)
                               .Include(c => c.WishList)
                               .Include(c => c.Data)
                               .ThenInclude(c => c.Locker)
                               .ThenInclude(c => c.Items)
                               .Include(c => c.Data)
                               .ThenInclude(c => c.Trunk)
                               .ThenInclude(c => c.Items)
                               .FirstOrDefault(c => c.ID == character.ID);

                if (existing != null)
                {
                    if (character.Inventories != null)
                    {
                        var existingItems = existing.Inventories.SelectMany(i => i.Items).ToList();
                        var currentItems  = character.Inventories.SelectMany(i => i.Items).ToList();

                        foreach (var existingItem in existingItems)
                        {
                            if (currentItems.All(i => i.ID != existingItem.ID))
                            {
                                Entry(existingItem).State = EntityState.Deleted;
                            }
                        }
                    }

                    if (character.WishList != null)
                    {
                        var existingWishList = existing.WishList.ToList();
                        var currentWishList  = character.WishList.ToList();

                        foreach (var existingTrunkItem in existingWishList)
                        {
                            if (currentWishList.All(i => i.ID != existingTrunkItem.ID))
                            {
                                Entry(existingTrunkItem).State = EntityState.Deleted;
                            }
                        }
                    }

                    if (character.Data?.Locker?.Items != null)
                    {
                        var existingLockerItems = existing.Data.Locker.Items.ToList();
                        var currentLockerItems  = character.Data.Locker.Items.ToList();

                        foreach (var existingTrunkItem in existingLockerItems)
                        {
                            if (currentLockerItems.All(i => i.ID != existingTrunkItem.ID))
                            {
                                Entry(existingTrunkItem).State = EntityState.Deleted;
                            }
                        }
                    }

                    if (character.Data?.Trunk?.Items != null)
                    {
                        var existingTrunkItems = existing.Data.Trunk.Items.ToList();
                        var currentTrunkItems  = character.Data.Trunk.Items.ToList();

                        foreach (var existingTrunkItem in existingTrunkItems)
                        {
                            if (currentTrunkItems.All(i => i.ID != existingTrunkItem.ID))
                            {
                                Entry(existingTrunkItem).State = EntityState.Deleted;
                            }
                        }
                    }
                }
            }
        }