public static void Import(SocialNetworkEntities db, IEnumerable<SocialNetworkXML.Models.Friendship> friendships) { var userNamesAdded = new HashSet<string>(); var counter = 0; foreach (var friendship in friendships) { // FirstUser var firstUser = new UserProfile(); if (userNamesAdded.Contains(friendship.FirstUser.Username)) { firstUser = db.UserProfiles.Where(u => u.Username == friendship.FirstUser.Username).First(); } else { firstUser = new UserProfile() { Username = friendship.FirstUser.Username, FirstName = friendship.FirstUser.FirstName, LastName = friendship.FirstUser.LastName, RegistrationDate = friendship.FirstUser.RegisteredOn, }; userNamesAdded.Add(firstUser.Username); var images = new HashSet<Image>(); foreach (var image in friendship.FirstUser.Images) { images.Add(new Image() { URL = image.ImageUrl, FileExtension = image.FileExtension, }); } firstUser.Images = images; } // Second user var secondUser = new UserProfile(); if (userNamesAdded.Contains(friendship.SecondUser.Username)) { secondUser = db.UserProfiles.Where(u => u.Username == friendship.SecondUser.Username).First(); } else { secondUser = new UserProfile() { Username = friendship.SecondUser.Username, FirstName = friendship.SecondUser.FirstName, LastName = friendship.SecondUser.LastName, RegistrationDate = friendship.SecondUser.RegisteredOn, }; userNamesAdded.Add(secondUser.Username); var imagesOfSecondUser = new HashSet<Image>(); foreach (var image in friendship.SecondUser.Images) { imagesOfSecondUser.Add(new Image() { URL = image.ImageUrl, FileExtension = image.FileExtension, }); } secondUser.Images = imagesOfSecondUser; } // Friendship var friendshipToAdd = new Friendship() { IsApproved = friendship.Approved, DateApproved = friendship.FriendsSince, FirstUser = firstUser, SecondUser = secondUser, }; db.Friendships.Add(friendshipToAdd); // Messages foreach (var message in friendship.Messages) { var author = new UserProfile(); if (firstUser.Username == message.Author) { author = firstUser; } else { author = secondUser; } var messageToAdd = new ChatMessage() { Content = message.Content, DateTimeOfSending = message.SentOn, DateTimeOfSeeing = message.SeenOn, Author = author, Friednship = friendshipToAdd, }; db.ChatMessages.Add(messageToAdd); if (counter == 100) { db.SaveChanges(); db.Dispose(); db = new SocialNetworkEntities(); db.Configuration.AutoDetectChangesEnabled = false; db.Configuration.ValidateOnSaveEnabled = false; counter = 0; Console.Write("."); } counter++; } db.SaveChanges(); } }
private void FriendshipImport() { var document = new XmlDocument(); document.Load(FriendshipPath); var root = document.DocumentElement; if (root != null) { var recordIndex = 0; foreach (XmlNode node in root.ChildNodes) { // relationship true/false bool relationType = bool.Parse(node.Attributes["Approved"].InnerText); DateTime friendsSince = DateTime.Now; if (relationType) { friendsSince = DateTime.Parse(node.FirstChild.InnerText); } var friendship = new Friendship(); // only for approved friendships if (relationType) { friendship.Approved = true; friendship.ApproveDate = friendsSince; } else { friendship.Approved = false; } // I know it's bad practise, but no time for refactoring #region FIRST USER int firstId; var firstUser = this.GetUserFromNode( node.SelectSingleNode("FirstUser/Username"), node.SelectSingleNode("FirstUser/FirstName"), node.SelectSingleNode("FirstUser/LastName"), node.SelectSingleNode("FirstUser/RegisteredOn")); var firstImages = this.GetImagesFromNode(node.SelectNodes("FirstUser/Images/Image")); if (this.data.Users.Any(x => x.UserName == firstUser.UserName)) { // update user info and images var user = this.data .Users .First(x => x.UserName == firstUser.UserName); user.FirstName = firstUser.FirstName; user.LastName = firstUser.LastName; user.RegistrationDate = firstUser.RegistrationDate; if (firstImages.Count > 0) { foreach (var firstImage in firstImages) { user.Images.Add(firstImage); } } this.data.Users.AddOrUpdate(user); this.data.SaveChanges(); this.data = new SocialNetworkDbContext(); firstId = user.Id; } else { // add user and get id if (firstImages.Count > 0) { foreach (var firstImage in firstImages) { firstUser.Images.Add(firstImage); } } this.data.Users.AddOrUpdate(firstUser); this.data.SaveChanges(); firstId = this.data.Users.First(x => x.UserName == firstUser.UserName).Id; this.data = new SocialNetworkDbContext(); } #endregion // I know it's bad practise, but no time for refactoring #region SECOND USER int secondId; var secondUser = this.GetUserFromNode( node.SelectSingleNode("SecondUser/Username"), node.SelectSingleNode("SecondUser/FirstName"), node.SelectSingleNode("SecondUser/LastName"), node.SelectSingleNode("SecondUser/RegisteredOn")); var secondImages = this.GetImagesFromNode(node.SelectNodes("SecondUser/Images/Image")); if (this.data.Users.Any(x => x.UserName == secondUser.UserName)) { // update user info and images var user = this.data .Users .First(x => x.UserName == secondUser.UserName); user.FirstName = secondUser.FirstName; user.LastName = secondUser.LastName; user.RegistrationDate = secondUser.RegistrationDate; if (secondImages.Count > 0) { foreach (var secondImage in secondImages) { user.Images.Add(secondImage); } } this.data.Users.AddOrUpdate(user); this.data.SaveChanges(); this.data = new SocialNetworkDbContext(); secondId = user.Id; } else { // add user and get id if (secondImages.Count > 0) { foreach (var secondImage in secondImages) { secondUser.Images.Add(secondImage); } } this.data.Users.AddOrUpdate(secondUser); this.data.SaveChanges(); secondId = this.data.Users.First(x => x.UserName == secondUser.UserName).Id; this.data = new SocialNetworkDbContext(); } #endregion // MESSAGES var messages = this.GetMessages(node.SelectNodes("Messages/Message")); friendship.FirstUserId = firstId; friendship.SecondUserId = secondId; if (messages.Count > 0) { friendship.Messages = messages; } this.data.Friendships.Add(friendship); if (recordIndex%10==0) { Console.Write("."); } if (recordIndex % 50 == 0) { this.data.SaveChanges(); this.data.Dispose(); this.data = new SocialNetworkDbContext(); } recordIndex++; } this.data.SaveChanges(); } }