Entity Framework пытается вставить в неправильную таблицу? - PullRequest
0 голосов
/ 16 октября 2018

Я создал тестовое приложение с Entity Framework для имитации базы данных, содержащей списки друзей.

Я хочу, чтобы база данных сохраняла идентификаторы пользователя, и когда я получаю их («AcceptedFriends»), я хочуEntity Framework также возвращает друзьям «usermodel».

Но каждый раз, когда я пытаюсь добавить 2 пользователей в друзья в таблицу «AcceptedFriends», возникает исключение:

" Violationограничения PRIMARY KEY 'PK_Users'. Невозможно вставить дубликат ключа в объект 'dbo.Users'. Значение дубликата ключа (GUID-значение идентификатора пользователя)"

Некоторые попытки решения:

  1. Решение 1

  2. Попытка создать 2 списка из одного и того же списка друзей (получено, отправлено), но это противоречит целичего я пытаюсь достичь.

  3. Решение 2

Вот файлы кодов:

"ПользователиМодель "

 public class Users
 {

    #region Private fields

    #endregion


    #region Public properties

    public string Username { get; set; }

    public string ID { get; set; }

    public string PasswordHash { get; set; }


    public virtual List<AcceptedFriends> AcceptedFriendsList { get; set; }

    // public virtual List<PendingFriends> PendingFriendsList { get; set; }

    // public virtual  List<RemovedFriends> RemovedFriendsList { get; set; }

    #endregion
}

" Модель принятых друзей "

    public class AcceptedFriends
    {
        #region Public properties

        public string RelationKey { get; set; }

        public string RequestSenderID { get; set; }

        public string RequestReceiverID { get; set; }


        public virtual List<Messages> ChatList { get; set; }


        public Users RequestSender { get; set; }

        public Users RequestReceiver { get; set; }

        #endregion
     }

"Создание модели базы данных"

        #region Users table

        // Create primary key in Users table
        modelBuilder.Entity<Users>().HasKey(property => property.ID);

        // Map Username to be unique
        modelBuilder.Entity<Users>().HasIndex(property => property.Username).IsUnique();

        // Create a one to many relation with AcceptedFriends table
        modelBuilder.Entity<Users>()
            .HasMany(property => property.AcceptedFriendsList)
            .WithOne(property => property.RequestReceiver)
            .HasForeignKey(property => property.RequestReceiverID);


        #endregion


        #region Accepted friends table

        // Create key for AcceptedFriends
        modelBuilder.Entity<AcceptedFriends>().HasKey(property => property.RelationKey);

        #endregion

Редактировать

Вот как я добавляю друзей

public static void AddFriends(AcceptedFriends friends)
{
    using(Context context = ConnectToDatabase())
    {
        context.AcceptedFriends.Add(friends);

        context.SaveChanges();
    };
 }

Редактировать 2

Здесь я добавляю друзей / пользователей

Плюс я заметил еще одно странное поведение при добавлении новых пользователейв таблицу друзей, не добавляя их сначала в таблицу пользователей. Сначала они добавляются в таблицу друзей и таблицу пользователей.

        Console.WriteLine("Connecting to database");

        DB.ConnectToDatabase();
        Console.WriteLine("Connected to database successfully");

        List<Users> userList = new List<Users>(DB.GetUsersList());

        List<AcceptedFriends> friendsCount = new List<AcceptedFriends>(DB.GetAcceptedFriends());


        if(userList.Count != 2)
        {
            DB.AddUser(new Users()
            {
                Username = "User1",
                PasswordHash = "PasswordHash",
            });

            DB.AddUser(new Users()
            {
                Username = "User2",
                PasswordHash = "PasswordHash",
            });

            userList = new List<Users>(DB.GetUsersList());
        };


        if(friendsCount.Count < 1)
        {
            Users user1 = userList[0];
            Users user2 = userList[1];

            DB.AddFriends(new AcceptedFriends()
            {
                RequestReceiver = user2,

                RequestSender = user1,
            });
        };

        Console.WriteLine("Server is great success!");

        Console.ReadLine();

Изменить 3

Возможно, у меня естьнашел решение.Он возвращает модели как для пользователя, так и для друзей, но я пока не могу принять это как решение, потому что мне кажется хаккейным (?)

(Благодаря @wertzui, вы помогли мне получитьк этому решению)

Обычно каждый раз, когда создается новый контекст, он настраивает друзей и пользователей на возврат своих пользовательских моделей

/// <summary>
    /// Gets the friends user models
    /// </summary>
    /// <param name="context"> The database context that was created </param>
    private static void SetupFriends(Context context)
    {
        // For every "AcceptedFriend"
        foreach(AcceptedFriends friend in context.AcceptedFriends)
        {
            // Get sender and receiver usermodels 
            // by matching ID's
            Users sender = context.Users.FirstOrDefault(user => user.ID == friend.RequestSenderID);
            Users receiver = context.Users.FirstOrDefault(user => user.ID == friend.RequestReceiverID);

            sender.AcceptedFriendsList.Add(friend);
            receiver.AcceptedFriendsList.Add(friend);

            friend.RequestSender = sender;
            friend.RequestReceiver = receiver;
        };
    }

1 Ответ

0 голосов
/ 16 октября 2018

Когда вы создаете новые пользовательские экземпляры в своем коде new AcceptFriends {...}, вы не устанавливаете их Id, поэтому они сохраняют значения по умолчанию, равные 0.Теперь Entity Framework думает, что вы хотите создать новую Дружбу с 2 новыми пользователями.Вместо этого вы должны заполнить их пользователями, которых вы создали ранее.

if(friendsCount.Count < 1)
{
    Users user1 = userList[0];
    Users user2 = userList[1];

    DB.AddFriends(new AcceptedFriends()
    {
        RequestReceiver = user1,
        RequestSender = user2,
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...