我们有一组 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/