外键更改时出现重复键错误

问题描述 投票:0回答:0

我在将外键值更新为新 ID 时遇到问题。我想更新我的联系人 ID,但它给了我重复密钥错误。

Microsoft.EntityFrameworkCore.DbUpdateException:保存实体更改时发生错误。有关详细信息,请参阅内部异常。

MySqlConnector.MySqlException(0x80004005):键“branches.IX_Branches_ContactPersonId”的重复条目“1f1cd1d9-25a1-4dee-bbd4-2b79a80551dd”

具有指定 id 的用户确实存在,但我很困惑为什么它似乎创建了另一条记录。

关系是一对一的:分支机构应该有联系人,但用户并不总是联系人。为了指定这种关系,分支有一个 ContactPersonId 和 ContactPerson 引用用户的 Id。

分支机构模型

public class Branch
{
    public Guid Id { get; set; } = Guid.NewGuid()!;
    public string BranchName { get; set; } = default!;
    public Guid? ContactPersonId { get; set; } = default!;
    public User? ContactPerson { get; set; } = default!;

    public DateTime Created { get; set; } = DateTime.Now;
  
    public ICollection<User>? Users { get; set;  } = new List<User>();
}

用户模型

public class User
{
    public Guid Id { get; set; } = Guid.NewGuid()!;
    public string FullName { get; set; } = default!;
    public string Email { get; set; } = default!;
    public string PhoneNumber { get; set; } = default!;
    public string? Password { get; set; }
    public string? Salt { get; set; }
    public UserRoles Role { get; set; }
    public Guid? BranchId { get; set; }
}

为了定义关系,我将其添加到我的上下文中

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Branch>()
        .HasOne<User>(s => s.ContactPerson)
        .WithOne()
        .HasForeignKey<Branch>(s => s.ContactPersonId);

    modelBuilder.Entity<Branch>()
        .HasMany<User>(s => s.Users)
        .WithOne()
        .HasForeignKey("BranchId");
}

服务中更新:

public async Task<bool> UpdateAsync(Branch item)
{
    var result = await _dbContext.Branches.FirstAsync(x => x.Id == item.Id);
    
    if (result != null)
    {
        result.BranchName = item.BranchName;
        result.Street = item.Street;
        result.HouseNumber = item.HouseNumber;
        result.Addition = item.Addition;
        result.City = item.City;
        result.ContactPersonId = item.ContactPersonId;
        result.BasicRiskFactor = item.BasicRiskFactor;
        result.DisplayDashboard = item.DisplayDashboard;
        result.RequestAssessment = item.RequestAssessment;
        result.LicenceDate = item.LicenceDate;
    }
    
    await _dbContext.SaveChangesAsync();

    return true;
}
c# asp.net entity-framework-core fluent
© www.soinside.com 2019 - 2024. All rights reserved.