2015-04-14 28 views
1

我對我的配置創建一個SQL ViewSeed實體框架代碼優先 - T-SQL視圖

protected override void Seed(QuiverContext context) 
{ 
    context.Database.ExecuteSqlCommand(DatabaseScripts.Views.MyView); 
} 

現在我想添加一個DBSetDbContext代表我的ViewI read that one can do this然後像Entity那樣使用常規表格。

所以我試過了,但它需要我添加一個我曾經做過的遷移,但是在創建視圖時update-database命令失敗,因爲首先創建了一個表。

+0

你也應該明白,你不能僅僅把一個視圖看作一個表......視圖有很多問題,特別是因爲它們可能不可更新,而且EF不能告訴主鍵可能是什麼這樣它會將所有不可爲空的字段視爲主鍵。一般來說,我發現使用EF的觀點是行不通的,但有些人認爲他們可以接受。 –

回答

1

它看起來像你想在你的Seed方法中創建一個視圖。這不是創建視圖的方式(請記住,每次運行任何遷移時都會運行種子方法)。

更好的方法是添加遷移。這將創建一個包含CreateTable行的代碼文件,這將使您的表。只需刪除這些行,然後用調用來創建視圖即可。

可以使用Sql命令,例如執行遷移內自定義SQL ...

Sql("CREATE VIEW myView....."); 

如果你想使事情更加堅固,可以create an extension for migrations,它允許你打電話CreateView的。

+0

嗯,我仍然可以使用''種子',我只需要確保我的遷移''Up''什麼都不做。將這個邏輯放在''seed''上會有一些好處,因爲我所有的腳本都會在這裏(sp的,視圖,觸發器)和每次都需要對這些腳本進行更改,所以我不需要污染我的遷移。但我仍然理解在遷移過程中的優勢,非常感謝。 –

+0

我傾向於使用'Sql'方法來提及所有的事情 - 我將使用Seed的唯一原因是如果您確實需要使用EF,而不是使用SQL添加事物。將代碼放入遷移中意味着您不必擔心是否應該運行它們。 – Richard