2014-09-24 35 views
0

我已經獲得了一個Visual Studio解決方案來啓動並重新開始運行。該項目首先使用實體​​框架數據庫。當我從數據庫生成模型時,sql想要將所有視圖轉換爲表格。我知道EF應該避免使用視圖,但考慮到開發人員不再適合我們,那麼糾正此問題的最佳方法是什麼?如何使用databasefirst和實體框架生成視圖?

謝謝

回答

0

我得出的結論是,沒有辦法在您的edmx中重新創建視圖實體回到實際的sql server數據庫視圖。需要發生的事情是,您將從模型生成sql並在sql server management studio查詢分析器中運行該sql。刪除創建的應該是視圖的表,並確定要寫入什麼查詢以便按照它們應該在sql server中重新創建視圖。一旦完成,模型中的視圖應該沒問題,並且在運行「從數據庫更新」時更新。

假設你有兩張表 - 分類和產品。你想創建一個名爲ProductsWithCategoryName的視圖。當您從數據庫做更新和這個觀點被添加到您的EDMX文件,查看XML顯示以下內容:

<EntitySet Name="ProductsWithCategoryName" EntityType="NorthwindModel.Store.ProductsWithCategoryName" store:Type="Views" store:Schema="dbo" store:Name="ProductsWithCategoryName"> 
    <DefiningQuery> 
     SELECT 
     [ProductsWithCategoryName].[ProductID] AS [ProductID], 
     [ProductsWithCategoryName].[ProductName] AS [ProductName], 
     [ProductsWithCategoryName].[UnitsInStock] AS [UnitsInStock], 
     [ProductsWithCategoryName].[CategoryName] AS [CategoryName] 
     FROM [dbo].[ProductsWithCategoryName] AS [ProductsWithCategoryName] 
    </DefiningQuery> 
</EntitySet> 

問題與上面的是定義查詢是不是創建視圖的查詢。讓你得到正確的定義查詢,你必須實際手動編輯EDMX文件中添加適當的查詢,如下所示:

<EntitySet Name="ProductsWithCategoryName" EntityType="NorthwindModel.Store.ProductsWithCategoryName" store:Type="Views" store:Schema="dbo" store:Name="ProductsWithCategoryName"> 
    <DefiningQuery> 
     SELECT  dbo.Products.ProductID, dbo.Products.ProductName, dbo.Products.UnitsInStock, dbo.Categories.CategoryName 
     FROM   dbo.Categories INNER JOIN 
     dbo.Products ON dbo.Categories.CategoryID = dbo.Products.CategoryID 
    </DefiningQuery> 
</EntitySet> 

這仍然不會給你一個適當的SQL視圖的預期結果得到建立。基本上,當從概念到數據庫進行EF時,只會爲每個實體生成一個表,並且視圖僅被視爲另一個實體。

+0

另請注意,如果以前的開發人員執行此操作並再次運行「從數據庫更新」,則這些更改將會丟失。我不確定保存視圖查詢的正確方法。 – Kirby 2014-10-01 14:43:01

0

在實體框架中使用視圖沒有任何問題。我假設你的意思是說,當你從數據庫更新它試圖將視圖轉換爲模型對象。這很好。通常您需要指定視圖的主鍵。默認情況下,Entity Framework將嘗試使用每個非null屬性作爲關鍵字。在每個屬性的上下文菜單中,您可以切換此。

您是否收到錯誤?

+0

這是數據庫首次使用實體框架,我遇到的問題是當您嘗試從包含Visual Studio解決方案的模型中創建數據庫時。你當然可以做到這一點,它的行爲就像你先做模型(在第一次構建你的數據庫之後,它會先轉換成數據庫)。問題是,當模型具有從數據庫添加的視圖時,模型第一種方法不起作用。視圖不會被創建爲視圖。他們會顛倒成你的數據庫中的表,這不是我想要的。 – Kirby 2014-09-30 17:00:34

+0

我有點困惑。如果你正在做數據庫第一視圖工作很好,很容易實現。它通常會抱怨主鍵。我不知道你有什麼問題。從數據庫更新時將返回哪些消息? – 2014-09-30 17:06:45

+0

我想你在這裏失去的是我不再擁有數據庫的事實。如果您不再擁有數據庫,則無法將EF edmx文件中的視圖正確創建回SQL Server視圖。 EF會將它們創建爲數據庫中的表格。所以我不是「從數據庫更新」再次這是數據庫不存在的情況。 – Kirby 2014-09-30 18:56:32