C# 实体框架试图插入错误的表?

C# 实体框架试图插入错误的表?,c#,sql,.net,entity-framework,entity-framework-core,C#,Sql,.net,Entity Framework,Entity Framework Core,我用实体框架构建了一个测试应用程序,以模拟包含好友列表的数据库 我希望数据库存储用户ID,当我检索它们(“AcceptedFriends”)时,我希望实体框架也返回friends“usermodel” 但每次我尝试将2个用户作为好友添加到“AcceptedFriends”表时,它都会失败 引发异常: “违反主键约束‘PK_Users’。无法在对象‘dbo.Users’中插入重复键。重复键值为(用户ID的GUID值)” 一些尝试性的解决方案: 试图创建两个相同的好友列表(已接收、已发送),但这与

我用实体框架构建了一个测试应用程序,以模拟包含好友列表的数据库

我希望数据库存储用户ID,当我检索它们(“AcceptedFriends”)时,我希望实体框架也返回friends“usermodel”

但每次我尝试将2个用户作为好友添加到“AcceptedFriends”表时,它都会失败 引发异常:

违反主键约束‘PK_Users’。无法在对象‘dbo.Users’中插入重复键。重复键值为(用户ID的GUID值)

一些尝试性的解决方案:

  • 试图创建两个相同的好友列表(已接收、已发送),但这与我试图实现的目标背道而驰

  • 以下是代码文件:

    “用户模型”

     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
    }
    
    编辑2

    这里是我添加朋友/用户的地方

    另外,当我向friends表添加新用户时,我注意到了另一个奇怪的行为 在不首先将它们添加到用户表的情况下,它会将它们同时添加到朋友表和用户表

            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();
    
    Console.WriteLine(“连接到数据库”);
    DB.ConnectToDatabase();
    Console.WriteLine(“已成功连接到数据库”);
    List userList=新列表(DB.GetUsersList());
    List friendsCount=新列表(DB.GetAcceptedFriends());
    如果(userList.Count!=2)
    {
    DB.AddUser(新用户()
    {
    Username=“User1”,
    PasswordHash=“PasswordHash”,
    });
    DB.AddUser(新用户()
    {
    Username=“User2”,
    PasswordHash=“PasswordHash”,
    });
    userList=新列表(DB.GetUsersList());
    };
    如果(friendsCount.Count<1)
    {
    用户user1=userList[0];
    Users user2=userList[1];
    DB.AddFriends(新的AcceptedFriends()
    {
    RequestReceiver=user2,
    RequestSender=user1,
    });
    };
    WriteLine(“服务器非常成功!”);
    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;
            };
        }
    
    //
    ///获取好友用户模型
    /// 
    ///创建的数据库上下文
    私有静态void SetupFriends(上下文)
    {
    //为了每一个“被接受的朋友”
    foreach(上下文中的AcceptedFriends。AcceptedFriends)
    {
    //获取发送方和接收方用户模型
    //通过匹配ID
    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=发件人;
    friend.RequestReceiver=接收者;
    };
    }
    
    new AcceptFriends{…}
    代码中创建新用户实例时,您没有设置它们的
    Id
    ,因此它们保留默认值
    0
    。现在实体框架认为,您希望与两个新用户建立新的友谊。相反,您应该使用前面创建的用户来填充它们

    if(friendsCount.Count < 1)
    {
        Users user1 = userList[0];
        Users user2 = userList[1];
    
        DB.AddFriends(new AcceptedFriends()
        {
            RequestReceiver = user1,
            RequestSender = user2,
        });
    }
    
    if(friendsCount.Count<1)
    {
    用户user1=userList[0];
    Users user2=userList[1];
    DB.AddFriends(新的AcceptedFriends()
    {
    RequestReceiver=user1,
    RequestSender=user2,
    });
    }
    
    请分享如何创建/添加您的
    好友
    -变量。请再看一眼刚才我明白你的意思了
    friends
    是我用来传递friend modelGood建议的参数,但它不起作用,顺便说一句,在进一步测试之后,实体框架似乎会自动添加ID。我尝试将用户的映射到friends表的方式可能有“错误”吗?请尝试设置RequestReceiverId和RequestSenderId,而不是对象。已尝试。它添加了它们是的,但是它破坏了我试图实现的目标,因为它没有加载“朋友”“用户”模型。
            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();
    
    /// <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;
            };
        }
    
    if(friendsCount.Count < 1)
    {
        Users user1 = userList[0];
        Users user2 = userList[1];
    
        DB.AddFriends(new AcceptedFriends()
        {
            RequestReceiver = user1,
            RequestSender = user2,
        });
    }