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

.NET6中XML解析及Machine与MachineDescription数据库映射求助

.NET6中XML解析与EF Core实体关联问题

问题描述

我是.NET6新手,正在解析4层嵌套XML文件,尝试通过Model Builder将数据写入本地数据库,但在关联Machine和MachineDescription实体时遇到问题。

XML片段:

<machines>
  <machine>
    <manufacturer>SDBSDBSDKB</manufacturer>
    <name>NKSDBSDKJBDSKBDB</name>
    <description>
      <DEU>JBSDSBDKKJ</DEU>
      <ENU>NDSIDBSSKBKJB</ENU>
    </description>
    <type>DSIBDSDBJKSD</type>
    <number>0-200-84-3151</number>
    <cfg_r>
      <connection>JJSBJSBKDSJDBS</connection>
      <cfg_r_text> JHBSJBDISBKDBSKDBSBDKBSDKLN </cfg_r_text>
      <cfg_r_physical_unit_abbreviation> KBJSBDKSKJBSDSKJB 
      </cfg_r_physical_unit_abbreviation>
      <cfg_r_displaytext> JSDHSDVSDVSDDSKBJDB 
      </cfg_r_displaytext>
    </cfg_r> 
  </machine>
</machines>

我尝试通过外键关联Machine和MachineDescription,但当前代码存在错误:

Machine类中外键配置:

[ForeignKey(nameof(MachineDescription.Id))]
public int DescriptionID { get; set; }         

MachineDescription类定义:

public class MachineDescription
{
    public int Id { get; set; }
    public string DEU_desc { get; set; }
    public string ENU_desc { get; set; }

    [ForeignKey(nameof(Machine.Id))]
    public MachineDescription MachineId { get; set; }
}

Model Builder代码:

modelBuilder.Entity<Models.Machine>().HasData(from machine in placeholder.Elements("machine")
  select new Models.Machine
  {
      Id = idx++,
      Manufacturer = machine.Element("manufacturer").Value,
      Name = machine.Element("name").Value,
      MachinesDecriptions.Append(
          new MachineDescription
          {
            Id = descID++,
            DEU_desc = machine.Element("description").Element("DEU").Value,
            ENU_desc = machine.Element("description").Element("ENU").Value,
            MachineId = descID
          }),

      Type = machine.Element("type").Value,
      Number = machine.Element("number").Value,
  });

需要实现Machine与MachineDescription的正确关联,且不能手动添加数据。


解决方案

1. 修正实体类的关联关系

根据XML结构,每个Machine对应一个description,配置一对一关联,修正实体类如下:

Machine类:

public class Machine
{
    public int Id { get; set; }
    public string Manufacturer { get; set; }
    public string Name { get; set; }
    public string Type { get; set; }
    public string Number { get; set; }

    // 导航属性:关联对应的MachineDescription
    public MachineDescription Description { get; set; }
}

MachineDescription类:

public class MachineDescription
{
    public int Id { get; set; }
    public string DEU_desc { get; set; }
    public string ENU_desc { get; set; }

    // 外键:关联所属的Machine
    public int MachineId { get; set; }
    // 导航属性:反向关联Machine
    public Machine Machine { get; set; }
}

2. 配置EF Core模型关系

在OnModelCreating中明确实体间的关联规则:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    // 配置Machine与MachineDescription的一对一关系,外键挂载在MachineDescription表
    modelBuilder.Entity<Machine>()
        .HasOne(m => m.Description)
        .WithOne(d => d.Machine)
        .HasForeignKey<MachineDescription>(d => d.MachineId);
}

3. 修正Model Builder的HasData插入逻辑

EF Core的HasData需要分别插入主实体和关联实体,保证外键对应正确:

int machineId = 1;
int descId = 1;

// 先插入Machine主实体
modelBuilder.Entity<Machine>().HasData(
    from machine in placeholder.Elements("machine")
    select new Machine
    {
        Id = machineId++,
        Manufacturer = machine.Element("manufacturer").Value.Trim(),
        Name = machine.Element("name").Value.Trim(),
        Type = machine.Element("type").Value.Trim(),
        Number = machine.Element("number").Value.Trim()
    });

// 再插入MachineDescription关联实体,绑定对应Machine的Id
modelBuilder.Entity<MachineDescription>().HasData(
    from machine in placeholder.Elements("machine")
    select new MachineDescription
    {
        Id = descId++,
        DEU_desc = machine.Element("description").Element("DEU").Value.Trim(),
        ENU_desc = machine.Element("description").Element("ENU").Value.Trim(),
        MachineId = descId - 1 // 匹配对应Machine的自增Id
    });

4. 补充说明

  • 使用Trim()去除XML元素值中的冗余空格,保证数据整洁
  • 确保placeholder是正确加载的XML根节点(如XDocument.Load("你的XML路径").Root)
  • 执行迁移命令更新数据库:Add-Migration AddMachineAndDescription,再运行Update-Database

内容的提问来源于stack exchange,提问作者Grimmace_23

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:01:11