我首先使用实体框架核心和代码来制作一些表。
我想要一个带有两个外键的表,两个都为应用程序用户。
我已经构建并运行它,但是每次我尝试将其添加到表中时都会出现错误
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个不同的行。
答案 0 :(得分:1)
我的猜测是_userManager.GetUserAsync(User)
与DbContext
不在同一个_context
上运行。因此_context
并不知道该ApplicationUser
,并将尝试创建它。解决方法是保存之前Attach
为ApplicationUser。