2011-05-16 50 views
19

我在ASP.NET MVC 3 Web應用程序中使用實體框架「代碼優先」方法。在我的數據庫中,我有幾個計算列。我需要使用這些列來顯示數據(工作正常)。實體框架代碼第一個計算屬性

但是當我來到行插入這個表,我發現了以下錯誤:

The column "ChargePointText" cannot be modified because it is either a computed column or is the result of a UNION operator.

有沒有辦法在我的課爲只讀標記屬性?

public class Tariff 
{ 
    public int TariffId { get; set; } 
    public int Seq { get; set; } 
    public int TariffType { get; set; } 
    public int TariffValue { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public int ChargePoint { get; set; } 
    public string ChargePointText { get; set; } 
} 
+1

是的,你是對的 - 我的回答是不正確的。只有當你想讓EF生成數據庫時,它才能工作。將更新發布爲答案並接受它。 – 2011-05-16 09:39:53

回答

33

我找到了解決方案。實體框架提供了一個名爲DatabaseGenerated的數據註釋。使用這樣的:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public string ChargePointText { get; set; } 

這裏獲得更多詳細信息:http://msdn.microsoft.com/en-us/library/gg193958.aspx

+0

你能夠得到這個更新的工作?特別是對於模型類的「LastUpdatedOn」屬性的「DateTime」屬性? – 2016-03-12 19:03:57

2

有一對夫婦的其他選擇。

首先是從在映射文件更改屬性設置:

this.Property(t => t.Name) 
    .HasMaxLength(152); 

到:

this.Property(t => t.Name) 
    .HasMaxLength(152) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 

這是幾乎一樣同Huggill的解決方案,它除了保留這個配置在映射中,而不是在模型中。我覺得這樣稍微好一些,因爲映射類已經包含了告訴實體框架如何加載該類型實體的代碼,所以計算字段的知識就屬於這種情況。

另一種選擇是NotMappedAttribute,其可以適用於實體的各個屬性,像這樣:

public class User 
{ 
    ... 

    [NotMapped] 
    public string Name 
    { 
     get; 
     set; 
    } 

    ... 
} 

這是當實體包含未從數據庫中填充性質是有用的,但它應該是在OP所面臨的情況下同樣有用,即EF不會嘗試推出標有NotMappedAttribute的財產的價值,因此插入應該起作用。

+3

他正在嘗試使用計算的數據庫字段。 「NotMapped」不會幫助他做到這一點。 – 2014-01-26 21:52:56

+0

你讀過我寫的完整答案嗎? – 2014-01-27 11:14:13

+2

是的。我做到了。使用未映射的屬性不會幫助他在他的應用程序中顯示db計算的字段,除非他也想在他的應用程序中計算它們。 – 2014-01-28 20:48:48

相關問題