Сначала я использую ядро и код структуры сущностей для создания некоторых таблиц.
Мне нужна одна таблица с двумя внешними ключами, причем оба приложения являются пользователями приложения.
У меня он собран и работает, но каждый раз, когда я пытаюсь добавить в таблицу, я получаю сообщение об ошибке
SqlException: Violation of PRIMARY KEY constraint 'PK_ApplicationUser'. Cannot insert duplicate key in object 'dbo.ApplicationUser'. The duplicate key value is (ef20a79d-e819-499d-b006-c32f5cf85577).
Это может быть просто проблемой проектирования базы данных, но мне кажется, чтоЯ делаю это должно работать.
Вот модели:
public class Test
{
public string TestId { get; set; }
[ForeignKey("Giver")]
public string GiverId { get; set; }
public virtual ApplicationUser Giver { get; set; }
[ForeignKey("Getter")]
public string GetterId { get; set; }
public virtual ApplicationUser Getter { get; set; }
}
// Add profile data for application users by adding properties to the ApplicationUser class
public class ApplicationUser : IdentityUser
{
[InverseProperty("Giver")]
public ICollection<CustomModels.Test> Giver { get; set; }
[InverseProperty("Getter")]
public ICollection<CustomModels.Test> Getter { get; set; }
}
Вот код для создания таблицы:
migrationBuilder.CreateTable(
name: "Tests",
columns: table => new
{
TestId = table.Column<string>(nullable: false),
GetterId = table.Column<string>(nullable: true),
GiverId = table.Column<string>(nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Tests", x => x.TestId);
table.ForeignKey(
name: "FK_Tests_ApplicationUser_GetterId",
column: x => x.GetterId,
principalTable: "ApplicationUser",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
table.ForeignKey(
name: "FK_Tests_ApplicationUser_GiverId",
column: x => x.GiverId,
principalTable: "ApplicationUser",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
});
migrationBuilder.CreateIndex(
name: "IX_Tests_GetterId",
table: "Tests",
column: "GetterId");
migrationBuilder.CreateIndex(
name: "IX_Tests_GiverId",
table: "Tests",
column: "GiverId");
Этокак я добавляю в БД:
Test test = (new Test
{
Giver = await _userManager.GetUserAsync(User),
Getter = await _userManager.Users.FirstOrDefaultAsync(u => u.Email == "s@gmail.com")
});
_context.Tests.Add(test);
await _context.SaveChangesAsync();
Я хотел бы иметь возможность отслеживать, какой пользователь предоставляет информацию, а какой пользователь получает информацию.
Мы использовали только электронную почту пользователядля отслеживания, но нам нужно было бы искать электронную почту каждый раз, и я чувствую, что это было бы лучшим долгосрочным решением.
Я должен иметь возможность добавлять в качестве своих «тестовых» строк и повторять пользователей,то есть user1 может дать user2 и наоборот, и это будет 2 разных строки.