Не удается заставить LinqDataSource распознавать подробные отношения

у меня есть две таблицы: Publication и DTPersonnel. Публикация имеет первичный ключ, а другой (DTPersonnel) имеет поле, которое является обратной ссылкой на публикацию. Я отправил макет DBML для моего LinqDataSource и связал две таблицы. Я добавил компонент LinqDataSource на свою веб-страницу и (для тестирования) метку.

Затем я настроил привязку данных метки так, чтобы она указывала на поле в DTPersonnel.DTRoleID следующим образом:

 <asp:FormView ID="FormView1" runat="server" AllowPaging="True" 
        DataSourceID="LinqDataSource1">
        <ItemTemplate>
            <asp:Label ID="Label1" runat="server" 
    Text='<%# BIND("DTPersonnels.DTRoleID") %>'></asp:Label>
        </ItemTemplate>
    </asp:FormView>
    </asp:Content>

Мой LinqDataSource настроен следующим образом:

<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Layout.aspx.cs" Inherits="AequorPubTracker.Account.Layout" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <asp:LinqDataSource ID="LinqDataSource1" runat="server" 
        ContextTypeName="AequorPubTracker.LayoutDataContext" EntityTypeName="" 
        onselecting="LinqDataSource1_Selecting" TableName="Publications" 

        Select="new (DTPersonnels.DTRoleID,PublicationID, DTPersonnels, ActLAYDate, ActRRIPDate, ActPPIDate, ActPPODate, ActECTWDate, TargetECTWDate, TargetPPIDate, TargetRRIPDate, TargetPPODate, TargetLAYDate)">
    </asp:LinqDataSource>

Но когда я запускаю приложение в браузере, я получаю следующую ошибку:

Сведения об исключении: System.Web.Query.Dynamic.ParseException: свойство или поле «DTRoleID» не существует в типе «EntitySet`1»

Я надеюсь, что дал достаточно информации, любая помощь будет отличной.


person Mike    schedule 19.10.2011    source источник


Ответы (2)


Я предполагаю, что, поскольку вы указываете предложение select, это представление данных только для чтения. Если это так, ваша проблема имеет довольно простое решение. Однако, если это не так (в чем я не уверен, поскольку ваш код вызывает метод Bind, а не Eval), для обновления связанных полей требуется более сложная обработка, поскольку LinqDataSource с указанным элементом Select не может разрешить обновление.

Убедитесь, что вы выбрали член DTPersonnels в своем предложении, но удалите DTPersonnels.DTRoleID из выбора. Если вы вызовете Eval("DTPersonnels.DTRoleID"), он отобразит значение члена связанной записи.

Однако я предполагаю, что проблема также связана с конфигурацией вашего файла схемы. Из того, что я могу сделать, вы ожидаете, что между Publications и DTPersonnel будет отношение один к одному. Однако, поскольку ошибка указывает на отсутствие члена в EntitySet, это означает, что вы разрешили связь 1-ко-многим, где Publications имеет много DTPersonnel. Если связи 1-к-1 нет, ваш код не сможет определить, какую связанную запись DTRoleID отображать.

Если вы на самом деле ДЕЙСТВИТЕЛЬНО хотите, чтобы было много DTPersonnel, связанных с Publication, то вы можете подойти к этому с другой стороны, отобразив список DTPersonnel и вместо этого отобразив связанные с ними данные Publication.

person lsuarez    schedule 19.10.2011
comment
Да, мне пришлось использовать DTPersonnel, потому что у меня много строк данных DTPersonnel. Я также использовал eval вместо привязки, что, похоже, решило мою проблему, спасибо. - person Mike; 20.10.2011

Если вам интересно, откуда берется сама ошибка, она находится здесь:

Select="new (DTPersonnels.DTRoleID,PublicationID, DTPersonnels, ActLAYDate, ActRRIPDate, ActPPIDate, ActPPODate, ActECTWDate, TargetECTWDate, TargetPPIDate, TargetRRIPDate, TargetPPODate, TargetLAYDate)">

Поскольку вы выбираете данные из таблицы «Публикации», он ищет там поле «DTRoleID». Я предполагаю, что в этой таблице нет поля «DTRoleID», что вызывает ошибку, которую вы получаете.

person KreepN    schedule 19.10.2011