Проблемы внешнего ключа с пользователем приложения - PullRequest
1 голос
/ 15 апреля 2019

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

Мне нужна одна таблица с двумя внешними ключами, причем оба приложения являются пользователями приложения.

У меня он собран и работает, но каждый раз, когда я пытаюсь добавить в таблицу, я получаю сообщение об ошибке

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 разных строки.

1 Ответ

1 голос
/ 15 апреля 2019

Я думаю, _userManager.GetUserAsync(User) не работает на том же DbContext, что и _context. Так что _context не знает об этом ApplicationUser и попытается его создать. Разрешение для этого будет Attach ApplicationUser перед сохранением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...