使用LINQ避免数据库Office记录重复并关联OfficeContact
问题解决方案
1. 修正实体类关系(实现一个Office对应多个OfficeContact)
当前实体为一对一关联,需调整为一对多结构,确保一个办公地址对应一条Office记录,同时可关联多个联系人:
Office 类(修改后)
public class Office { [Key] public int OfficeId { get; set; } public string Region { get; set; } public string Address { get; set; } public string City { get; set; } [Display(Name = "Circuit")] public int CircuitId { get; set; } [ForeignKey("CircuitId")] public virtual Circuit Circuits { get; set; } [Display(Name = "RegionalTechnician")] public int RegionalTechnicianId { get; set; } [ForeignKey("RegionalTechnicianId")] public virtual RegionalTechnician RegionalTechnicians { get; set; } // 新增:关联多个OfficeContact public virtual ICollection<OfficeContact> OfficeContacts { get; set; } = new List<OfficeContact>(); }
OfficeContact 类(修改后)
public class OfficeContact { [Key] public int OfficeContactId { get; set; } public string Name { get; set; } public string Email { get; set; } public string Phone { get; set; } // 新增:关联所属Office的外键 public int OfficeId { get; set; } [ForeignKey("OfficeId")] public virtual Office Office { get; set; } }
2. 修改保存逻辑:判断Office是否存在,关联已有Office或创建新Office
保存时先通过地址+城市判断Office是否已存在,避免重复创建,再将新联系人关联到目标Office:
// 1. 查询是否存在相同地址的Office var existingOffice = context.Offices .FirstOrDefault(o => o.Address == cbAddress.Text && o.City == cbCity.Text); Office office; if (existingOffice == null) { // 不存在则创建新Office office = new Office() { Address = cbAddress.Text, City = cbCity.Text, // 补充其他必填字段(如Region、CircuitId等) }; context.Offices.Add(office); context.SaveChanges(); } else { // 存在则直接使用现有Office office = existingOffice; } // 2. 创建联系人并关联到目标Office OfficeContact officeContact = new OfficeContact() { Name = cbLocalOfficeContactName.Text, Email = tbLocalOfficeEmail.Text, Phone = tbLocalOfficePhone.Text, OfficeId = office.OfficeId // 绑定到对应Office的ID }; context.OfficeContacts.Add(officeContact); context.SaveChanges();
3. 查询指定Office的所有联系人
使用Include方法加载关联的联系人集合,两种常见查询方式:
方式1:通过OfficeId查询
int targetOfficeId = 1; // 替换为实际要查询的OfficeID var officeWithContacts = context.Offices .Include(o => o.OfficeContacts) .FirstOrDefault(o => o.OfficeId == targetOfficeId); // 获取该Office下的所有联系人 var contacts = officeWithContacts?.OfficeContacts;
方式2:通过地址和城市查询
string targetAddress = "XX街道XX号"; string targetCity = "XX市"; var officeWithContacts = context.Offices .Include(o => o.OfficeContacts) .FirstOrDefault(o => o.Address == targetAddress && o.City == targetCity); var contacts = officeWithContacts?.OfficeContacts;
内容的提问来源于stack exchange,提问作者PUSH
相关产品推荐
相关产品推荐

