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