這篇文章純屬自娛自樂,由於在實際開發中用到私有化屬性映射的可能性幾乎爲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); } });