EntityDataSource и Entity Framework 6

Я изучаю ASP.NET. Я пришел к элементу управления EntityDataSorce. Я использую EF6. Я читал, что у этого элемента управления и EF6 есть некоторые проблемы, конфликты, но с последним обновлением EntityDataSource эта проблема была решена. http://blogs.msdn.com/b/webdev/archive/2014/02/28/announcing-the-release-of-dynamic-data-provider-and-entitydatasource-control-for-entity-framework-6.aspx

Я пытаюсь перейти по ссылке выше. Сначала я создаю модель .edmx

введите здесь описание изображения

Установите новый EntityDataSource Contro с помощью NuGet.

введите здесь описание изображения

Я добавил два элемента управления EntityDataSource и изменил префикс одного из них на ef. Итак, у меня есть два элемента управления, один из них старый, а другой обновленный.

введите здесь описание изображения

Когда я нажимаю старый, я вижу всплывающее окно конфигурации и открываю экран «Настройка источника данных». Но при нажатии на новый всплывающее окно не появляется. Итак, как я могу настроить источник данных? Что с этим не так?

введите здесь описание изображения

Web.config

    <?xml version="1.0"?>
<!--
  For more information on how to configure your ASP.NET application, please visit
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
  </configSections>
  <system.web>
    <compilation debug="true" targetFramework="4.5">
      <assemblies>
        <add assembly="System.Web.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
        <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
      </assemblies>
    </compilation>
    <httpRuntime targetFramework="4.5"/>
    <pages>
      <controls>
        <add tagPrefix="ef" assembly="Microsoft.AspNet.EntityDataSource" namespace="Microsoft.AspNet.EntityDataSource"/>
      </controls>
    </pages>
  </system.web>
  <connectionStrings>
    <add name="SampleDbEntities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=OMER-HP\SQLEXPRESS2014OK;initial catalog=SampleDb;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient"/>
  </connectionStrings>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb"/>
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>
    </providers>
  </entityFramework>
</configuration>

По умолчанию.aspx:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication6.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

        <ef:EntityDataSource ID="EntityDataSourceNew" runat="server">
        </ef:EntityDataSource>
        <br />
        <asp:EntityDataSource ID="EntityDataSourceOld" runat="server">
        </asp:EntityDataSource>

    </div>
    </form>
</body>
</html>

person Omer K    schedule 14.09.2014    source источник
comment
удалите EntityDataSource и добавьте его снова. Это может сработать   -  person Seminda    schedule 15.09.2014
comment
Также это может помочь вам. stackoverflow .com/questions/19792144/   -  person Seminda    schedule 15.09.2014
comment
@Seminda, к сожалению, они не помогли   -  person Omer K    schedule 15.09.2014


Ответы (5)


Пользовательский интерфейс не поддерживается при использовании EF6. Мы больше не рекомендуем использовать Entity Data Source для новых проектов, поэтому мы просто сделали работу, чтобы предоставить источник данных, который можно использовать с EF6. Вам нужно выполнить настройку непосредственно в разметке.

person Rowan Miller    schedule 15.09.2014
comment
Что рекомендуется для новых проектов? - person user957479; 29.03.2015
comment
Я второй @user957479. Можете ли вы уточнить рекомендуемый подход к новым проектам? Возможно, вы предлагаете вместо этого использовать привязку модели? Но что, если у кого-то есть QueryableExtender, прикрепленный к источнику данных? Можно ли это воспроизвести с привязкой модели так же чисто? - person julealgon; 02.06.2015
comment
Чистое и простое разочарование ... Я спрашиваю вас, и я спрашиваю о причине? !!?! - person Vincenzo Costa; 18.11.2015
comment
Хороший вопрос, @user957479. Я думал, что буду использовать этот новый проект, над которым я работаю, как возможность поиграть с EF в проекте WebForms, но, думаю, я сдамся и вернусь к созданию хранимых процедур в моей базе данных. Это может быть неуклюже, но, по крайней мере, это работает, и я знаю, что делаю. Однажды я изучу MVC... - person Philip Stratford; 19.08.2016

Ответ Дова Миллера был близок, но не сработал для меня, потому что я не понимал, какое имя я поставил для ContextTypeName. Я создал свою модель с помощью конструктора и не нашел в решении имени, производного от ObjectContext.

Итак, я сделал это, просмотрев множество потоков:

  1. Вместо ContextTypeName добавлено свойство EntitySetName, указывающее на свойство Set моего класса.

  2. Выберите EntityDataSource и дважды щелкните событие OnContextCreating, чтобы создать метод события. Ввел в него следующий код, чтобы преобразовать DbContext в ObjectContext и разрешил IObjectContextAdapter, чтобы добавить правильное использование предложения.

    var context = новый MyModelContainer(); e.Context = ((IObjectContextAdapter)context).ObjectContext;

Наконец-то он заработал как источник данных для gridview.

Нашел указанное выше решение в этой теме, где ответ пользователя2076170 показывает код события на шаге 2 выше. Я нашел шаг 1 самостоятельно.

person user173399    schedule 13.06.2017
comment
ContextTypeName — это имя контейнера сущностей в свойствах диаграммы edmx. Если файл edmx находится в другом проекте в решении, добавьте имя проекта, например MyProject.MyEntities, а если у проекта есть специальный суффикс, например DAL, добавьте его также, MyProject.DAL.MyEntities. - person Dov Miller; 30.07.2017
comment
Если я не ошибаюсь, этот ответ хорош для EF4, но не для EF6, к которому относится вопрос. - person Dov Miller; 30.07.2017

Я также столкнулся с этой проблемой и нашел «Привязку модели» http://www.asp.net/web-forms/overview/presenting-and-managing-data/model-binding/retrieving-data.

Сообщение проходит через процесс создания классов модели данных «Code First», однако я просто переключил ItemType на классы, сгенерированные с помощью процесса «EF Designer из базы данных...», и это сработало просто отлично.

Надеюсь, это поможет кому-то, кто все еще ищет.

Майк

person Mike    schedule 30.11.2015

Из этой ссылки я узнал, что Entity DataSource не работает с Entity Framework 6 Upgrade в ответе Сергея, что вы можете перенести старый EntityDataSource из панели инструментов в дизайнер, а затем изменить префикс тега на ef вместо asp. (Я получил ссылку в комментарии Семинды к вопросу здесь). После этого вы можете продолжить работу с ним в окне дизайнера и свойств, и он работает.

В ответе упоминается, что если вы используете события EntityDataSource, вам нужно изменить код позади

От

protected void OnContextCreating(object sender, EntityDataSourceContextCreatingEventArgs e){... } 

TO

protected void OnContextCreating(object sender, Microsoft.AspNet.EntityDataSource.EntityDataSourceContextCreatingEventArgs e){... } 

Суть в том, чтобы добавить Microsoft.AspNet.EntityDataSource к EventArgs.

Также удалите свойства DefaultContainerName и ConnectionString и просто установите ContextTypeName в EntityDataSource, как указано в комментарии LMK.

Я надеюсь, что это может помочь тем, кто все еще хочет использовать EntityDataSource с дизайнером, а не только с помощью разметки.

person Dov Miller    schedule 20.02.2017

Начиная с апреля 2020 г. и EF6, вы можете использовать nuget для установки Microsoft.AspNet.EntityDataSource, затем измените префикс тега вашего источника данных с asp на ef. Вот несколько рабочих примеров:

См. примечания выше от Дова Миллера относительно различий в атрибутах.

Основы

<ef:EntityDataSource ID="anyIdYouWant" runat="server" ContextTypeName="yourFullyQualifedEFClassName" EntitySetName="nameOfEntitiesOrTable" />

С предложением WHERE

<ef:EntityDataSource ID="anyIdYouWant" runat="server" ContextTypeName="yourFullyQualifedEFClassName" EntitySetName="nameOfEntitiesOrTable"
    EntityTypeFilter="nameOfEntitiesOrTable" Where="it.someProperty = @someProperty">
    <WhereParameters>
        <asp:SessionParameter DbType="Int32" Direction="Input" Name="someProperty" SessionField="someFieldOnYourForm" />
    </WhereParameters>
</ef:EntityDataSource>
person rainabba    schedule 08.04.2020