应用程序用户的外键问题

时间:2019-04-15 19:56:54

标签: c# entity-framework-core

我首先使用实体​​框架核心和代码来制作一些表。

我想要一个带有两个外键的表,两个都为应用程序用户。

我已经构建并运行它,但是每次我尝试将其添加到表中时都会出现错误

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 个答案:

答案 0 :(得分:1)

我的猜测是_userManager.GetUserAsync(User)DbContext不在同一个_context上运行。因此_context并不知道该ApplicationUser,并将尝试创建它。解决方法是保存之前Attach为ApplicationUser。