You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:30:16