.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
相关产品推荐
相关产品推荐

