public static void Main()
        {
            var context = new DiabloEntities();

            var xDocument = XDocument.Load(@"..\..\users-and-games.xml");

            var xUsers = xDocument.XPathSelectElements("/users/user");

            foreach (var xUser in xUsers)
            {
                var xGames = xUser.XPathSelectElements("games/game");

                bool gameFail = false;

                using (var dbContextTransactions = context.Database.BeginTransaction())
                {
                    var user = CreateUser(xUser, context);

                    foreach (var xGame in xGames)
                    {
                        gameFail = CreateGame(xGame, context, user, gameFail);
                    }

                    if (gameFail)
                    {
                        dbContextTransactions.Rollback();
                    }
                    else
                    {
                        dbContextTransactions.Commit();
                    }
                }
            }
        }
        public static void Main()
        {
            var context = new DiabloEntities();

            var characterNames = context.Characters.Select(ch => ch.Name);

            foreach (var characterName in characterNames)
            {
                Console.WriteLine(characterName);
            }
        }
        public static void Main()
        {
            var context = new DiabloEntities();

            var finishedGames = context.Games
                .Where(g => g.IsFinished)
                .OrderBy(g => g.Name)
                .ThenBy(g => g.Duration)
                .Select(g => new
                             {
                                 GameName = g.Name,
                                 Duration = g.Duration,
                                 Users = g.UsersGames.Select(u => new
                                                                      {
                                                                          Username = u.User.Username,
                                                                          IpAddress = u.User.IpAddress
                                                                      })
                             });

            var xGames = new XElement("games");

            foreach (var finishedGame in finishedGames)
            {
                var xGame = new XElement("game");
                xGame.Add(new XAttribute("name", finishedGame.GameName));

                if (finishedGame.Duration != null)
                {
                    xGame.Add(new XAttribute("duration", finishedGame.Duration));
                }

                var xUsers = new XElement("users");
                foreach (var user in finishedGame.Users)
                {
                    var xUser = new XElement(
                        "user",
                        new XAttribute("username", user.Username),
                        new XAttribute("ip-address", user.IpAddress));
                    xUsers.Add(xUser);
                }

                xGame.Add(xUsers);
                xGames.Add(xGame);
            }

            new XDocument(xGames).Save(@"..\..\finished-games.xml");
            Console.WriteLine("Export finished-games.xml complited!");
        }
        public static void Main()
        {
            var context = new DiabloEntities();

            var characters = context.Characters
                .OrderBy(ch => ch.Name)
                .Select(ch => new
                              {
                                  name = ch.Name,
                                  playedBy = ch.UsersGames.Select(u => u.User.Username)
                              });

            JavaScriptSerializer js = new JavaScriptSerializer();

            var charactersJson = js.Serialize(characters);

            File.AppendAllText(@"..\..\characters.json", charactersJson);
            Console.WriteLine("Export characters.json complited!");
        }
        private static User CreateUser(XElement xUser, DiabloEntities context)
        {
            User user;
            var xUsername = xUser.Attribute("username").Value;

            if (!context.Users.Any(u => u.Username == xUsername))
            {
                user = new User();

                user.FirstName = null;
                if (xUser.Attribute("first-name") != null)
                {
                    user.FirstName = xUser.Attribute("first-name").Value;
                }

                user.LastName = null;
                if (xUser.Attribute("last-name") != null)
                {
                    user.LastName = xUser.Attribute("last-name").Value;
                }

                user.Email = null;
                if (xUser.Attribute("email") != null)
                {
                    user.Email = xUser.Attribute("email").Value;
                }

                user.Username = xUsername;
                user.IsDeleted = xUser.Attribute("is-deleted").Value != "0";
                user.IpAddress = xUser.Attribute("ip-address").Value;
                user.RegistrationDate = Convert.ToDateTime(xUser.Attribute("registration-date").Value);

                context.Users.Add(user);
                Console.WriteLine("Successfully added user {0}", user.Username);
                context.SaveChanges();
                return user;
            }

            Console.WriteLine("User {0} already exists", xUsername);
            return null;
        }
        private static bool CreateGame(XElement xGame, DiabloEntities context, User user, bool gameFail)
        {
            var gameName = xGame.Element("game-name").Value;
            var characterName = xGame.Element("character").Attribute("name").Value;
            var characterCash = decimal.Parse(xGame.Element("character").Attribute("cash").Value);
            var characterLevel = int.Parse(xGame.Element("character").Attribute("level").Value);
            DateTime gameJoinedOn;
            bool isValidDate = DateTime.TryParse(xGame.Element("joined-on").Value, out gameJoinedOn);

            Game game = context.Games.FirstOrDefault(g => g.Name == gameName);
            var characterId = context.Characters
                .Where(ch => ch.Name == characterName)
                .Select(ch => ch.Id)
                .FirstOrDefault();

            if (game != null && user != null && characterCash >= 0 && isValidDate)
            {
                UsersGame usersGame = new UsersGame();
                usersGame.GameId = game.Id;
                usersGame.CharacterId = characterId;
                usersGame.Cash = characterCash;
                usersGame.Level = characterLevel;
                usersGame.JoinedOn = gameJoinedOn;
                usersGame.UserId = user.Id;

                context.UsersGames.Add(usersGame);
                context.SaveChanges();
                Console.WriteLine("User {0} successfully added to game {1}", user.Username, game.Name);
            }
            else
            {
                gameFail = true;
            }

            return gameFail;
        }