예제 #1
0
        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();
            }
        }
예제 #2
0
        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();
            }
        }