实体数据源和实体框架6

9
我正在学习ASP.NET。我现在接触到EntityDataSource控件,使用的是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模型文件。
然后我通过NuGet安装了新版本的EntityDataSource控件。
我添加了两个EntityDataSource控件,并将其中一个的前缀改为ef。因此我现在有两个控件,一个是旧版本的,另一个是升级后的新版本。
当我点击旧版本的控件时,弹出了配置弹框,并能够打开“Configure Data Source”界面。但是当我点击新版本的控件时,却没有弹框。那么,我该如何配置数据源呢?这是什么问题?
以下是我的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>

Default.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>

1
移除 EntityDataSource 然后再添加一遍。这样或许会起作用。 - Seminda
1
这也许会对你有所帮助。https://dev59.com/e3jZa4cB1Zd3GeqPiMg5 - Seminda
@Seminda,不幸的是,他们没有提供帮助。 - Omer
5个回答

15

使用EF6时不支持用户界面。我们不再建议在新项目中使用Entity Data Source,因此我们已经完成了使用EF6可用的数据源的工作。您需要直接在标记中执行配置。


1
嗨,Rowan,我看过你在MSDN实体框架博客上非常有帮助的视频。Code First to Existing Database真是太棒了。我们目前正在努力将第三方Web服务消耗到EE模型中。你能分享一下如何操作的视频吗?第三方是ERP软件。我们有一个asp.net Web模块,需要设置来消耗这个Web服务。 - bonCodigo
15
新项目的推荐方式是什么? - user957479
3
我同意@user957479的看法。你能否详细说明新项目的推荐方法?也许你建议使用模型绑定?但是,如果有人将QueryableExtender附加到数据源上,那该怎么办?使用模型绑定是否可以像这样干净地复制它? - julealgon
2
纯粹的沮丧...我问你,我要一个理由?!!! - Vincenzo Costa
2
好问题,@user957479。我本来想利用我正在开发的新项目来尝试在WebForms项目中使用EF,但我想我会放弃并回到在我的数据库中创建存储过程。虽然它可能有些笨重,但至少它能够工作,而且我知道自己在做什么。总有一天我会学习MVC... - Philip Stratford

2
Dov Miller的回答接近于正确,但对我来说不起作用,因为我不知道在ContextTypeName中放置什么名称。我是用设计器创建模型的,我没有在解决方案中找到任何源自ObjectContext的名称。
因此,在查看了许多线程后,我做了这个:
1.添加EntitySetName属性,指向我的类的Set属性,而不是ContextTypeName。 2.选择EntityDataSource并双击事件OnContextCreating以创建事件方法。在其中输入以下代码将DbContext转换为ObjectContext,并解析IObjectContextAdapter以添加适当的using子句。 var context = new MyModelContainer(); e.Context = ((IObjectContextAdapter)context).ObjectContext;
最终它作为gridview的数据源工作了。
此线程中发现了上述解决方案,其中user2076170的答案显示了步骤2中的事件代码。我自己发现了步骤1。

ContextTypeName 是 edmx 图表属性中的实体容器名称。如果 edmx 文件位于解决方案中的另一个项目中,请添加项目名称,例如 MyProject.MyEntities,如果该项目具有特殊后缀,例如 DAL,请也将其添加,MyProject.DAL.MyEntities。 - Dov Miller
如果我没记错的话,这个答案适用于EF4,但不适用于与问题相关的EF6。 - Dov Miller

2
我从Sergey的答案中学到了这个链接Entity DataSource not working with 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 中。

还需要删除属性 DefaultContainerNameConnectionString,只需在 EntityDataSource 上设置 ContextTypeName,如 LMK 的评论中所述。

希望这能帮助那些仍然想要使用设计器而不仅仅通过标记来使用 EntityDataSource 的人。


1

0
截至2020年4月和EF6,您可以使用NuGet安装Microsoft.AspNet.EntityDataSource,然后将数据源的标签前缀从asp更改为ef。以下是一些可行的示例:
请参阅Dov Miller上面的注释,了解属性差异。
基础知识:
<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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接