我正在使用西裝外套和身份框架制作一個網路應用程式。我希望該物件BoardYear與Member作為 IdentityUser 類并通過下拉串列選擇的主席建立一對一的關系。
當我嘗試插入一個BoardYear令人興奮的新Member主席時,我收到以下 SQL 例外。
SqlException: 違反 PRIMARY KEY 約束“PK_AspNetUsers”。無法在物件“dbo.AspNetUsers”中插入重復鍵。重復的鍵值為 (de20c079-ed99-4bf9-9474-d8eb1a05b5b6)。
物體框架似乎想要將參考添加Member到資料庫中,這是不可能的,因為它已經存在。
成員類:
public class Member : IdentityUser
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Guid? ChairmanBoardYearId { get; set; }
public BoardYear ChairmanBoardYear { get; set; }
...
}
學年班:
public class BoardYear
{
[Key]
public Guid BoardYearId { get; set; }
[DataType(DataType.Date)]
public DateTime StartDate { get; set; }
[DataType(DataType.Date)]
public DateTime EndDate { get; set; }
public Member Chairman { get; set; }
}
該關系在 dbcontext 中配置如下:
public class ApplicationDbContext : IdentityDbContext<Member>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<BoardYear>()
.HasOne(m => m.Chairman)
.WithOne(b => b.ChairmanBoardYear)
.HasForeignKey<Member>(m => m.ChairmanBoardYearId);
base.OnModelCreating(builder);
}
public DbSet<BoardYear> BoardYears { get; set; }
public DbSet<Commission> Commissions { get; set; }
public DbSet<CommissionFine> CommissionFines { get; set; }
public DbSet<MemberFine> MemberFines { get; set; }
public DbSet<Meeting> Meetings { get; set; }
public DbSet<MeetingFile> MeetingFiles { get; set; }
public DbSet<MemberSanction> MemberSanctions { get; set; }
public DbSet<CommissionSanction> CommissionSanctions { get; set; }
public DbSet<YearGroup> YearGroups { get; set; }
public DbSet<CommissionList> CommissionLists { get; set; }
}
When the dropdown is edited the chairman is assigned like this in the razor page (I can see it gets the correct member):
async void OnBoardUserChange()
{
Member selectedMember = await MemberService.FindMember(selectedChairmanId);
curBoardYear.Chairman = selectedMember;
}
And then put in the database in the following service:
public class BoardYearService
{
private readonly IDbContextFactory<ApplicationDbContext> _contextFactory;
private readonly DidaDbContext _db;
public BoardYearService(IDbContextFactory<ApplicationDbContext> contextFactory)
{
_contextFactory = contextFactory;
}
public async Task<int> Create(BoardYear boardYear)
{
using (var ctx = _contextFactory.CreateDbContext())
{
CommissionList boardYearCommissionList = new CommissionList();
boardYear.CommissionList = boardYearCommissionList;
ctx.BoardYears.Add(boardYear);
return await ctx.SaveChangesAsync();
}
}
}
uj5u.com熱心網友回復:
問題是您已經從 MemberService.FindMember 使用的任何背景關系實體中檢索了用戶,但是在添加到新背景關系實體的 BoardYear 中參考了它。
添加 BoardYear 的第二個背景關系實體不跟蹤成員,因此假設它是一個添加項。
要么使用通過同一背景關系實體檢索并持久保存的資料執行整個操作,要么僅使用 BoardYear 上的 Id 欄位而不是導航屬性。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/364427.html
標籤:c# asp.net-core entity-framework-core asp.net-core-identity
上一篇:是否可以將IdentityServer4中的用戶注銷為不同的用戶?
下一篇:D3-帶對數刻度的面積圖
