我在将外键值更新为新 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;
}