FormView с EntityDataSource и DropDownList выдает «Имена свойств« {0} »не найдены в сущности ...» - PullRequest
2 голосов
/ 23 августа 2010

Проблема: , когда я пытаюсь выполнить обновление, используя EntityDataSource и FormView, которые имеют <asp:DropDownList> ссылку на другую таблицу, страница загружается нормально с правильной настройкой, нопри обновлении я получаю это сообщение об ошибке:

Свойство с именем 'Vendor.VendorId' не найдено в объекте во время операции вставки, обновления или удаления.Убедитесь, что свойства, указанные в качестве выражений привязки, доступны для источника данных.

Среда и код: с использованием Visual Studio 2010, Entity Framework 4, ASP.NET веб-форм и SQL Server 2008 Express.

У меня есть две таблицы;Part стол и Vendor стол.Таблица Part имеет столбец VendorId, который связан с таблицей Vendor, и ему разрешено быть NULL.Он упакован в Entity Framework.

Часть, которая работает: Вот EntityDataSource:

<asp:EntityDataSource ID="PartEntityDataSource" runat="server" 
    ConnectionString="name=PartDBEntities" 
    DefaultContainerName="PartDBEntities" EnableFlattening="True" 
    EntitySetName="Parts" 
    EntityTypeFilter="Part" Where="it.PartId = @PartId" 
    EnableUpdate="True" EnableInsert="True" Include="Vendor">
    <WhereParameters>
        <asp:QueryStringParameter Type="Int64" DefaultValue="null" Name="PartId" 
            QueryStringField="partid" />
        </WhereParameters>
</asp:EntityDataSource>

(Примечание: я пробовал с EnableFlatteningвкл. и выкл.)

Это связано с FormView:

<asp:FormView ID="PartEditorFormView" runat="server"
    DataSourceID="PartEntityDataSource"
    DataKeyNames="PartId">

Обратите внимание, что я принудительно FormView перехожу в режим Edit или Insert в зависимости отдля параметров строки запроса.

Без DropDownList я могу создавать и обновлять записи в базе данных.

Часть, которая не работает: теперь для DropDownList.Сначала есть новый EntityDataSource:

<asp:EntityDataSource ID="VendorEntityDataSource" runat="server"
    ConnectionString="name=PartDBEntities"
    DefaultContainerName="PartDBEntities" EnableFlattening="False"
    EntitySetName="Vendors" />

А затем DropDownList в EditTemplate, используя Преобразование нуля в полях шаблона :

<asp:DropDownList ID="EditVendorDDL" runat="server" 
    DataSourceID="VendorEntityDataSource" 
    DataTextField='CompanyName' 
    DataValueField='VendorId'
    AppendDataBoundItems="True"
    SelectedValue='<%# Bind("Vendor.VendorId") %>'>
        <asp:ListItem Selected="True" Value="">(none)</asp:ListItem>
</asp:DropDownList>

Как я уже говорил выше, начальная страница отображается нормально;DropDownList содержит правильные записи, и правильный поставщик установлен на правильное значение.Простое нажатие на кнопку Update вызывает вышеуказанную ошибку.

Вот соответствующая часть трассировки стека:

[InvalidOperationException: свойство с именем 'Vendor.VendorId' не было найдено в объекте во время вставки, обновления или удаленияоперация.
Убедитесь, что свойства, указанные как выражения привязки, доступны для источника данных.]
System.Web.UI.WebControls.EntityDataSourceView.ConvertProperties (значения IDictionary, PropertyDescriptorCollection propertyDescriptors, ParameterCollection referenceParameters, Dictionary`2 convertValues) + 263
System.Web.UI.WebControls.EntityDataSourceView.ExecuteUpdate (ключи IDictionary, значения IDictionary, IDictionary oldValues) + 256
System.Web.UI.DataSourceView.Update (ключи IDictionary, значения IDictionary, IDictionary oldValues, Обратный вызов DataSourceViewOperationCallback) + 95

Надеюсь, этого достаточно!

1 Ответ

4 голосов
/ 23 августа 2010

Если выбранное значение не должно быть с точки зрения PartEntityDataSource, поскольку VendorEntityDataSource не связывает общий элемент управления, связанный с данными, вам нужно использовать <%# Bind("VendorID") %>.

НТН.

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