这篇文章纯属自娱自乐,由于在实际开发中用到私有化属性映射的可能性几乎为0。在EF中默认映射的是具备 public 修饰符的属性,可是若是是 internal 、 private 和 protected 修饰的属性要映射进数据库怎么作呢?下面咱们分别来说解一下。数据库
咱们先建立代码实体类代码express
{ public int Id { get; set; } public string Name { get; set; } internal int Age { get; set; } }
在上面的实体类代码中,咱们看到 Age 属性的修饰符是 internal , EF是不会映射 Age 属性的,若是须要EF映射该属性就必须显示指定映射该属性。代码以下:ui
public class UserMap : EntityTypeConfiguration<User> { public UserMap() { ToTable("User"); HasKey(p => p.Id); Property(p => p.Age); } }
上面的代码中 Property(p => p.Age);
就是显示指定Age属性映射,若是去掉该行代码,EF将不会将 Age 属性映射进数据库。code
要让 private 和 protected 属性映射,须要用到部分类。咱们将前面的实体类修改一下:开发
public partial class User { public int Id { get; set; } public string Name { get; set; } private int Age { get; set; } }
上面的代码在类上面添加了 partial 关键字(这个关键字就是部分类关键字),而且咱们将 Age 属性的修饰符修改成 private,下面咱们就来看看如何映射 Age 属性。get
public partial class User { public class PrivatePropertyExtension { public static readonly Expression<Func<User, int>> expression = p => p.Age; } }
Property(User.PrivatePropertyExtension.expression);
代码完成后,Age 属性将会被映射。protected属性同理。固然,上面第二部的方法咱们也可使用 EF的API 去实现,咱们须要在上下文派生类中的 OnModelCreating 中设置将全部非公有属性映射到数据库:string
modelBuilder.Types().Configure(p => { var noPublic = p.ClrType.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance); foreach(var d in noPublic) { p.Property(d).HasColumnName(d.Name); } });