2010-02-08 14 views
4

我們有一組視圖(很多),我們試圖在實體框架中與它們的關係一起實現。這些視圖具有主鍵定義但由於某種原因,當我爲它們創建我接收到的消息的實體模型:在實體框架中處理視圖關係

表/圖「vwFoo」不具有限定的 主鍵。關鍵是 推斷和定義爲 創建爲只讀表/視圖。

除了使它們成爲只讀的,我們不想要的,關係不會被保留下來。有什麼方法可以正確加載到模型中嗎?

後端數據庫是SQL Server 2005中,但我們還需要支持2000

任何幫助,將不勝感激,

UPDATE & SOLUTION

這裏的XSLT轉換,成功地合作,將我們的EDMX中的兩個視圖轉換成表格。它有兩個問題:1)添加錯誤的xmlns =「」屬性,2)沒有正確設置UTF-8編碼。我在一個單獨的Perl腳本中解決了這兩個問題。

<?xml version="1.0" encoding="utf-8" ?> 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
       xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" 
       xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" 
       xmlns:ssdl="http://schemas.microsoft.com/ado/2006/04/edm/ssdl" 
       xmlns:edm="http://schemas.microsoft.com/ado/2006/04/edm" 
       xmlns:cs="urn:schemas-microsoft-com:windows:storage:mapping:CS" 
       exclude-result-prefixes="ssdl edm store cs" version="1.0"> 
    <xsl:output method="xml"/> 

    <!-- Copy any nodes that aren't specifically transformed --> 
    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- Transform vwPerson --> 
    <xsl:template match="edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema/ssdl:EntityType[@Name='vwPerson']/ssdl:Key"> 
     <Key> 
      <PropertyRef Name="fkPersonID" /> 
     </Key> 
    </xsl:template> 

    <xsl:template match="edmx:Edmx/edmx:Runtime/edmx:ConceptualModels/edm:Schema/edm:EntityType[@Name='vwPerson']/edm:Key"> 
     <Key> 
      <PropertyRef Name="fkPersonID" /> 
     </Key> 
    </xsl:template> 

    <xsl:template match="edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema/ssdl:EntityContainer/ssdl:EntitySet[@Name='vwPerson']"> 
     <EntitySet Name="vwPerson" 
        EntityType="DataMachineModel.Store.vwPerson" 
        store:Type="Tables" 
        Schema="dbo" /> 
    </xsl:template> 

    <!-- Transform vwPersonAddress --> 
    <xsl:template match="edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema/ssdl:EntityType[@Name='vwPersonAddress']/ssdl:Key"> 
     <Key> 
      <PropertyRef Name="PersonID" /> 
     </Key> 
    </xsl:template> 

    <xsl:template match="edmx:Edmx/edmx:Runtime/edmx:ConceptualModels/edm:Schema/edm:EntityType[@Name='vwPersonAddress']/edm:Key"> 
     <Key> 
      <PropertyRef Name="PersonID" /> 
     </Key> 
    </xsl:template> 

    <xsl:template match="edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema/ssdl:EntityContainer/ssdl:EntitySet[@Name='vwPersonAddress']"> 
     <EntitySet Name="vwPersonAddress" 
        EntityType="DataMachineModel.Store.vwPersonAddress" 
        store:Type="Tables" 
        Schema="dbo" /> 
    </xsl:template> 

</xsl:stylesheet> 

這似乎工作到目前爲止,使視圖功能像表;但它並不能保持它們之間的關係。我嘗試通過XSLT在EDMX中添加FK關聯,但沒有成功。

我們已經決定從我們的視圖製作真正的表格,並將視圖邏輯遷移到一個單獨的類中,該類可以對我們需要的數據進行過濾。

回答

3

是的,EF設計師不能派生出一個視圖的PK,所以you have to help it out

+0

此解決方案不起作用,因爲隨着我們的數據庫增長/更改,我需要在每次更新後手動重新調整.edmx文件。 Linq2Sql在這種情況下是更好的選擇嗎?它似乎仍不能保持關係,但我沒有看到PK問題。 – 2010-02-08 17:47:08

+0

不要手動進行。使用XSLT。 – 2010-02-08 17:59:33

+1

這對PKs有效,但我找不到一種方法讓協會工作,所以我們最終重組了我們的數據庫。 – 2010-02-09 17:47:59