2014-01-13 73 views
0

我有幾個屬性,我沒有在數據庫中的直接映射,所以我使用了具有映射到數據庫的另一個變量的約定,以及將用於執行所有操作的公共變量我的實際工作。常見的是[將布爾屬性映射到char列] [1],但我也有一個StatusID屬性,其C#枚舉基於派生類型是不同的。NotMapped屬性保持相關屬性不被保存?

我公共屬性上有[NotMapped]屬性,我的內部屬性有[Column]屬性。我認爲有些東西是因爲公共屬性沒有被映射,所以它也保留了其他屬性的映射。

在我的項目,我開始用一種抽象的基本郵件類:

[Table("tblMessage")] 
public abstract class Message { 
    [Column("msgIsSample")] 
    [Required] 
    internal string dbIsSample { get; set; } 

    [Column("msgStatusID")] 
    internal int? dbStatusId { get; set; } 

    [NotMapped] 
    public bool IsSample { 
     get { 
      return dbIsSample.ToUpper() == "Y"; 
     } 
     set { 
      dbIsSample = value ? "Y" : "N"; 
     } 
    } 

    public Message() { 
     this.IsSample = false; 
     this.dbStatusId = null; 
    } 
} 

現在我只有一個類實現的基類,請求:

public class Request : Message { 
    [NotMapped] 
    public int Status { 
     get { 
      return this.dbStatusId.HasValue ? this.dbStatusId.Value : 1; 
     } 
     set { 
      this.dbStatusId = value; 
     } 
    } 

    public Request() 
     : base() { 
      this.Status = 1; 
    } 
} 

這裏是我的上下文:

public class MyContext : DbContext { 
    public DbSet<Message> Messages { get; set; } 

    static MyContext() { 
     Database.SetInitializer<MyContext>(null); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) { 
     modelBuilder.Entity<Message>() 
        .Map<Request>(m => m.Requires("msgTypeID").HasValue(1)); 
    } 
} 

這是別人碰到的東西嗎?我還沒有找到任何有關爲什麼這種方式無法正常工作的問題,儘管這看起來像是公認的慣例,直到EF團隊添加了其他自定義映射。其他人必須解決這個問題。

當我嘗試執行此代碼,我得到一個DbUpdateException說,它不能插入NULL插入列「msgIsSample」由於我已經設置在表創建腳本。這沒有任何意義,因爲msgIsSample默認爲「N」。

回答

1

而不是使它internal,使它protected internal

在運行時,EF將動態子類化您的實體。這些擴展類被稱爲dynamic proxies

EF無法設置您的財產,因爲它無法訪問。要讓EF訪問您的財產,它必須有publicprotected訪問權限。您仍然可以擁有internal屬性,但通過添加protected修飾符給子類訪問。

[Table("tblMessage")] 
public abstract class Message { 
    [Column("msgIsSample")] 
    [Required] 
    public string dbIsSample { get; protected internal set; } 

    [Column("msgStatusID")] 
    public int? dbStatusId { get; protected internal set; } 
+0

謝謝!我試圖阻止它們在UI層中可見,並完全忘記了這一要求。我喜歡你的'受保護的內部集合';這將允許它們用於查詢。 – krillgar