Обработка отношений просмотра в Entity Framework - PullRequest
4 голосов
/ 08 февраля 2010

У нас есть набор (довольно много) представлений, которые мы пытаемся реализовать в 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, но безуспешно.

Мы решили создать из наших представлений реальные таблицы и перенести логику представления в отдельный класс, который может выполнять фильтрациюданные нам нужны.

1 Ответ

3 голосов
/ 08 февраля 2010

Да, разработчик EF не может получить PK представления, поэтому вы должны помочь ему .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...