EF6执行迁移操作时List<string>类型属性被忽略无对应表字段如何解决
核心原因
EF6 原生不支持直接映射基础类型(如string、int等)的集合属性到数据库,原因如下:
- 关系型数据库本身没有对应「字符串列表」这类集合类型的原生字段类型,无法直接生成对应字段
- EF6 默认的映射规则仅会识别实体类之间的关联关系(如你的代码里
Treatment和Doctor、Patient的关联),基础类型的集合属性会被默认忽略,不会参与表结构生成
可选解决方案
方案1:用单字段存储序列化后的集合内容
如果你不需要对集合内的元素做单独的SQL查询,可以将序列化为分隔字符串存储,示例代码如下:
using System.ComponentModel.DataAnnotations.Schema; public class Treatment { public int Id { get; set; } // 标记NotMapped,让EF忽略原始集合属性的映射 [NotMapped] public List<string> Issue { get; set; } [NotMapped] public List<string> Medicine { get; set; } [NotMapped] public List<string> Test { get; set; } public Doctor Doctor { get; set; } public Patient Patient { get; set; } // 实际映射到数据库的序列化字段 public string IssueStr { get => Issue == null ? null : string.Join(",", Issue); set => Issue = string.IsNullOrEmpty(value) ? new List<string>() : value.Split(',').ToList(); } public string MedicineStr { get => Medicine == null ? null : string.Join(",", Medicine); set => Medicine = string.IsNullOrEmpty(value) ? new List<string>() : value.Split(',').ToList(); } public string TestStr { get => Test == null ? null : string.Join(",", Test); set => Test = string.IsNullOrEmpty(value) ? new List<string>() : value.Split(',').ToList(); } }
重新执行迁移后,会在Treatments表生成IssueStr、MedicineStr、TestStr三个字符串类型字段存储集合内容。
方案2:创建子实体类生成独立关联表
如果需要对集合元素做单独的查询、筛选等操作,推荐遵循数据库范式,为每个集合创建对应的子实体,示例如下:
// 新增药品子实体 public class MedicineRecord { public int Id { get; set; } public string Name { get; set; } // 外键关联Treatment public int TreatmentId { get; set; } public Treatment Treatment { get; set; } } // Issue、Test同理创建对应的子实体类:IssueRecord、TestRecord // 修改Treatment类的集合属性类型 public class Treatment { public int Id { get; set; } public List<IssueRecord> Issues { get; set; } public List<MedicineRecord> Medicines { get; set; } public List<TestRecord> Tests { get; set; } public Doctor Doctor { get; set; } public Patient Patient { get; set; } }
重新执行迁移后,EF6会自动生成IssueRecords、MedicineRecords、TestRecords三张关联表,通过外键和Treatments表关联。
内容的提问来源于stack exchange,提问作者smkk
相关产品推荐
相关产品推荐

