Entity Framework 私有屬性映射

這篇文章純屬自娛自樂,由於在實際開發中用到私有化屬性映射的可能性幾乎爲0。在EF中默認映射的是具備 public 修飾符的屬性,可是若是是 internalprivateprotected 修飾的屬性要映射進數據庫怎麼作呢?下面咱們分別來說解一下。數據庫

零、 internal 屬性映射

咱們先建立代碼實體類代碼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

1、 private 和 protected 屬性映射

要讓 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

  1. 首先咱們定義一個User的部分類:
public partial class User
{
    public class PrivatePropertyExtension
    {
        public static readonly Expression<Func<User, int>> expression =
            p => p.Age;
    }
}
  1. 而後再UserMap 類中添加以下代碼:
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);
    }
});
相關文章
相關標籤/搜索