Sql server 在实体框架中处理视图关系

Sql server 在实体框架中处理视图关系,sql-server,database,entity-framework,Sql Server,Database,Entity Framework,我们有一组视图(相当多),我们正试图在实体框架中实现它们之间的关系。这些视图定义了主键,但由于某种原因,当我为它们创建实体模型时,收到了以下消息: 表/视图“vwFoo”没有 已定义主键。关键是 推断,定义为 创建为只读表/视图 除了使它们成为只读(这是我们不希望的)之外,这些关系也没有得到保留。有没有办法让这些文件正确加载到模型中 后端数据库是SQLServer2005,但我们还需要支持2000 任何帮助都将不胜感激 更新和解决方案 下面是一个XSLT转换,它成功地将EDMX中的两个视图转换为

我们有一组视图(相当多),我们正试图在实体框架中实现它们之间的关系。这些视图定义了主键,但由于某种原因,当我为它们创建实体模型时,收到了以下消息:

表/视图“vwFoo”没有 已定义主键。关键是 推断,定义为 创建为只读表/视图

除了使它们成为只读(这是我们不希望的)之外,这些关系也没有得到保留。有没有办法让这些文件正确加载到模型中

后端数据库是SQLServer2005,但我们还需要支持2000

任何帮助都将不胜感激

更新和解决方案

下面是一个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关联,但没有成功


我们决定从视图中生成真实的表,并将视图逻辑迁移到一个单独的类中,该类可以过滤我们需要的数据。

是的,EF设计器无法派生视图的PK,因此。

此解决方案不起作用,因为随着数据库的增长/更改,每次更新后我都需要手动重新调整.edmx文件。在这种情况下,Linq2Sql是更好的选择吗?它似乎仍然无法保持关系,但我没有看到PK问题。这对PKs有效,但我无法找到让关联正常工作的方法,因此我们最终重组了数据库。