Я создал тестовое приложение с Entity Framework для имитации базы данных, содержащей списки друзей.
Я хочу, чтобы база данных сохраняла идентификаторы пользователя, и когда я получаю их («AcceptedFriends»), я хочуEntity Framework также возвращает друзьям «usermodel».
Но каждый раз, когда я пытаюсь добавить 2 пользователей в друзья в таблицу «AcceptedFriends», возникает исключение:
" Violationограничения PRIMARY KEY 'PK_Users'. Невозможно вставить дубликат ключа в объект 'dbo.Users'. Значение дубликата ключа (GUID-значение идентификатора пользователя)"
Некоторые попытки решения:
Решение 1
Попытка создать 2 списка из одного и того же списка друзей (получено, отправлено), но это противоречит целичего я пытаюсь достичь.
- Решение 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;
};
}