У нас есть набор (довольно много) представлений, которые мы пытаемся реализовать в Entity Framework со своими отношениями.Для этих представлений определены первичные ключи , но по какой-то причине, когда я создаю модель Entity для них, я получил сообщение:
Таблица / представление 'vwFoo' не имеет первичногоключ определен.Ключ был выведен, и определение было создано как таблица / представление только для чтения.
Помимо того, что они сделаны только для чтения, чего мы не хотим, отношения не сохраняются.Есть ли способ заставить их правильно загружаться в модель?
Бэкэнд-база данных - SQL Server 2005, но нам также необходимо поддерживать 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>
Кажется, это работает, если заставить представления функционировать как таблицы;однако это не сохраняет отношения между ними.Я попытался добавить ассоциации FK в EDMX через XSLT, но безуспешно.
Мы решили создать из наших представлений реальные таблицы и перенести логику представления в отдельный класс, который может выполнять фильтрациюданные нам нужны.