sql-server - 在 Entity Framework 中处理 View 关系

标签 sql-server database entity-framework

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

The table/view 'vwFoo' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view.

除了将它们设置为只读(我们不希望如此)之外,这些关系不会被保留。有什么方法可以让它们正确加载到模型中吗?

后端数据库是SQL Server 2005,但我们也需要支持2000。

如有任何帮助,我们将不胜感激

更新和解决方案

这是一个 XSLT 转换,它成功地将两个 View 从我们的 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>

就 View 的功能而言,这似乎确实有效;但是它不会保留它们之间的关系。我尝试通过 XSLT 在 EDMX 中添加 FK 关联,但没有成功。

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

最佳答案

是的,EF 设计器无法导出 View 的 PK,所以 you have to help it out .

关于sql-server - 在 Entity Framework 中处理 View 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2223280/

相关文章:

sql - SQL Server 中的多个子句,其中所有列都不等于零

php - 如何将数据插入到一个表中,其中表名是一个 php 变量,它会根据按钮的点击而变化?

c# - 我应该如何使用集合?

java - 多次插入 SQL 数据库

c# - 如何从 SQL 连接中获取匹配和不匹配的行

mysql - 两个可能表的外键

mysql - 在 mysql 中替换时保留一列

entity-framework - EF CF 手动配置多对多映射

c# - 将实体映射到 DTO,无需重复代码

sql - 使用 Vbscript 处理大型 csv(500k 记录)并将其导入 SQL Server 的最佳方法是什么?