2017-01-02 14 views
-1

我使用EF-代碼第一次,這是我的模型與數據註釋:如何使用SQL的計算列在代碼第一

public int Count { get; set; } 
public int Fee { get; set; } 

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public int? Total { get; set; } 

而且我在SQL Server中的函數:

ALTER FUNCTION dbo.Function4 
(
    @Count INT, @Fee INT 
) 
RETURNS Int 
AS 
    BEGIN 
    DECLARE @Result INT 
    SET @Result = @Count * @Fee 
    RETURN 
    @Result 
END 

而且在總的計算列規範我寫這個公式:

([dbo].[Function4]([Count],[Fee])) 

這工作得很好。但我的問題是:每當我改變模型時,數據庫將重新創建,因爲我已經使用了DropCreateDatabaseIfModelChanges。我可以刪除[DatabaseGenerated(DatabaseGeneratedOption.Computed)]並從代碼中計算出來,但我想知道代碼中的[DatabaseGenerated(DatabaseGeneratedOption.Computed)]用法是什麼?

+1

你有外部創建你的函數傳遞,'DBO .Function4',你擔心它會消失,不會再被創建? –

+0

@ Nick.McDermaid是的。我的問題確實是這樣的。 –

+0

我可以想到兩種解決方案可能或不可行。 1.將其作爲內聯計算列(如果可能)。那麼你不需要數據庫中的UDF; 2.使用一個數據庫項目,與其他任何項目一起部署。數據庫項目包含您的UDF,並在某個時刻進行部署。 –

回答

0

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 

的使用表明,當一個行插入或更新數據庫生成的值。

See here

+0

我知道DatabaseGeneratedOption.Computed是什麼。但我的問題是,當我使用代碼第一次和DropCreateDatabaseIfModelChanges每當我改變我的模型數據庫中的計算列公式將清除,因爲我使用DropCreateDatabaseIfModelChanges。 –

+0

爲什麼你使用DropCreateDatabaseIfModelChanges呢?我的意思是必要的嗎? – Dronacharya

+0

因爲我經常改變我的模型,每次改變它都會重新創建我的數據庫。 –

0

DatabaseGeneratedOption.Computed-意味着酒店存在到數據庫,相應字段 - 但該值應該從數據庫中檢索,而不是從C#

+0

我知道'DatabaseGeneratedOption.Computed'是什麼。但我的問題是,當我使用代碼第一次和DropCreateDatabaseIfModelChanges每當我改變我的模型數據庫中的計算列公式將清除,因爲我使用DropCreateDatabaseIfModelChanges。 –

+0

你可以試試https://blog.3d-logic.com/2014/10/18/the-final-version-of-the-store-functions-for-entityframework-6-1-1-code-first-會議發佈/。或者執行在您的種子中創建函數的SQL查詢。 –