EF Core 2.0:能否仅映射特定列并忽略模型属性映射?
解决方案:EF Core 2.0 实现指定列映射与忽略模型属性
当然可行!这两个需求在EF Core 2.0中都有完善的实现方案,我来给你详细说明:
一、仅映射Report表的特定列(排除部分表列)
要让EF只映射Report表中的指定列,有两种常用方式:
方式1:模型类仅定义需要映射的属性
EF Core遵循约定优先的原则,默认会将模型类中的所有属性映射到数据库表的对应列(名称匹配的情况下)。所以如果你的Report表存在多余列,只需要在Report模型类中只定义需要映射的属性即可——EF会自动忽略表中那些没有对应模型属性的列,不会对它们进行任何读写操作。
举个例子:
假设Report表有Id、ReportName、Content、CreateTime、InternalRemark这几列,你只想映射Id、ReportName、CreateTime,那模型类就这么写:
public class Report { public int Id { get; set; } public string ReportName { get; set; } public DateTime CreateTime { get; set; } // 不定义Content和InternalRemark属性,EF就不会映射这两个表列 }
方式2:使用Fluent API显式配置(适用于特殊场景)
如果因为某些原因,模型类中必须包含表中多余列对应的属性,但你不想让EF映射这些列,其实这就属于第二个需求的范畴了(忽略模型属性)。不过如果要更精准地控制表列映射,也可以通过Fluent API显式指定要映射的列:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Report>() .ToTable("Report") .HasKey(r => r.Id) // 显式配置需要映射的列 .Property(r => r.ReportName).HasColumnName("ReportName") .Property(r => r.CreateTime).HasColumnName("CreateTime"); // 没有配置的属性(如果模型里有的话)会被EF忽略,对应表列也不会被映射 }
二、忽略模型类中的内部业务属性(不参与EF映射)
你提到的Ignore()方法确实是核心解决方案,除此之外还有DataAnnotations特性的方式,两种都适用于EF Core 2.0:
方式1:Fluent API的Ignore()方法
在DbContext的OnModelCreating方法中,针对Report实体指定要忽略的属性:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 忽略InternalData这个仅用于内部业务的属性 modelBuilder.Entity<Report>().Ignore(r => r.InternalData); }
方式2:DataAnnotations的[NotMapped]特性
直接在模型类的目标属性上添加[NotMapped]特性,更直观:
public class Report { public int Id { get; set; } public string ReportName { get; set; } // 这个属性仅用于内部业务,不参与EF映射 [NotMapped] public string InternalData { get; set; } }
两种方式效果一致,你可以根据自己的编码习惯选择——如果喜欢集中配置实体映射逻辑,就用Fluent API;如果喜欢属性就近标注,就用[NotMapped]。
内容的提问来源于stack exchange,提问作者RisingHerc
相关产品推荐
相关产品推荐

