5

我有一個名爲Client的類首先使用Entity Framework代碼映射到數據庫表。該表有一個計算字段,我需要在我的客戶端類中使用,但我知道無法寫入此字段。有沒有一種配置實體框架的方式來保存時忽略該屬性,但在閱讀時包含屬性?Entity Framework Code First - 如何在保存時忽略列

我已經嘗試在我的配置類中使用Ignore方法,或者使用[NotMapped]屬性,但是這些方法會阻止從數據庫中讀取屬性。作爲計算

回答

9

您可以使用DatabaseGeneratedAttributeDatabaseGeneratedOption.Computed選項:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public ComputedPropertyType ComputedProperty { get; set; } 

,或者如果你喜歡流暢的API,你可以在你的DbContext類使用HasDatabaseGeneratedOption方法:

public class EntitiesContext : DbContext 
{ 
    public DbSet<EntityType> Enities { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<EntityType>().Property(e => e.ComputedProperty).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 
    } 
} 
+1

謝謝,這似乎是答案。但是,因爲我正在使用我的計算屬性作爲另一個表的外鍵引用,所以現在我正在將「ReferentialConstraint中的依賴屬性映射到存儲生成的列」。它不再可以用它作爲外鍵引用嗎? – 2013-04-05 10:30:07

+0

@EasyTimer我真的很難想象這樣的情景。從EF的角度來看,這是不可能的,因爲如果您更改應用程序中的引用,EF需要能夠更新外鍵。也許在你的情況下(因爲我不知道你的具體要求)只是導航屬性就足夠了,請看看這裏:http://stackoverflow.com/questions/5691780/navigation-property-without-declaring-foreign -key – tpeczek 2013-04-05 10:54:19

+0

我已經通過將我的課程拆分爲兩個來解決我的問題,如本文中所述http://weblogs.asp.net/manavi/archive/2011/04/24/associations-in-ef-4-1-code- first-part-4-table-splitting.aspx我有一個包含計算字段的類和另一個包含任何需要編輯的字段的類。 – 2013-04-05 19:24:13

3

馬克屬性:

modelBuilder 
    .Entity<MyEntityType>() 
    .Property(_ => _.MyProperty) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 
+0

謝謝,這似乎是回答。但是,因爲我正在使用我的計算屬性作爲另一個表的外鍵引用,所以現在我正在將「ReferentialConstraint中的依賴屬性映射到存儲生成的列」。它不再可以用它作爲外鍵引用嗎? – 2013-04-05 10:13:35

+0

@EasyTimer:計算屬性作爲外鍵?我的天啊。如果計算結果與主鍵表中的任何主鍵值不匹配,你會怎麼做? – Dennis 2013-04-05 10:54:45

+0

我意識到這是一種不尋常的,並不理想的情況。恰巧,主鍵表本身就是一個視圖,其主鍵以與外鍵表相同的方式計算,並且不太可能存在任何差異。這是將新代碼引入遺留系統的一部分,在這裏我的雙手被輕微綁定。 – 2013-04-05 12:37:04

相關問題