EntityDataSource 和实体框架 6

Posted

技术标签:

【中文标题】EntityDataSource 和实体框架 6【英文标题】:EntityDataSource and Entity Framework 6 【发布时间】:2014-11-08 07:26:43 【问题描述】:

我正在学习 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 模型

使用 NuGet 安装新的 EntityDataSource 控件

我添加了两个 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>

【问题讨论】:

删除 EntityDataSource 并重新添加。它可能会起作用 这也可能对您有所帮助。 ***.com/questions/19792144/… @Seminda 不幸的是,他们没有帮助 【参考方案1】:

使用 EF6 时不支持用户界面。我们不再建议对新项目使用实体数据源,因此我们只是提供了一个可用于 EF6 的数据源。您需要直接在标记中进行配置。

【讨论】:

嗨,Rowan,我在MSDN entity framework blog.Code First to Existing Database was just great. 看到了您非常有用的视频。我们目前正在努力将第三方 Web 服务消费到 EE 模型中。你能分享一个视频如何去做。第三方是ERP软件。我们需要设置一个 asp.net Web 模块来使用此 Web 服务。 新项目的推荐方式是什么? 我第二个@user957479。您能否详细说明新项目的推荐方法?您是否建议改用模型绑定?但是,如果有人将QueryableExtender 附加到数据源怎么办?可以用模型绑定复制它吗? 纯粹而简单的挫败感......我问你,我问一个原因?!!?! 好问题,@user957479。我想我会使用我正在开发的这个新项目作为在 WebForms 项目中使用 EF 的机会,但我想我会放弃并返回在我的数据库中创建存储过程。它可能很笨重,但至少它有效,而且我知道我在做什么。总有一天我会学习 MVC...【参考方案2】:

Dov Miller 的回答很接近,但对我不起作用,因为我不明白我为 ContextTypeName 取了什么名字。我用设计器创建了我的模型,但在解决方案中我没有找到任何从 ObjectContext 派生的名称。

所以我在查看了很多线程后才这样做:

    添加了指向我的类的 Set 属性的 EntitySetName 属性,而不是 ContextTypeName。

    选中EntityDataSource并双击事件OnContextCreating创建事件方法。在其中输入以下代码将 DbContext 转换为 ObjectContext 并解析 IObjectContextAdapter 以添加正确的 using 子句。

    var context = new MyModelContainer(); e.Context = ((IObjectContextAdapter)context).ObjectContext;

它终于可以作为 gridview 的数据源了。

在this thread 中找到了上述解决方案,其中 user2076170 的回答显示了上述步骤 2 中的事件代码。我自己找到了第 1 步。

【讨论】:

ContextTypeName 是 edmx 图属性中的实体容器名称。如果 edmx 文件在解决方案中的不同项目中,请添加项目名称,如 MyProject.MyEntities,如果项目有特殊后缀,如 DAL,也添加 MyProject.DAL.MyEntities。 如果我没记错的话,这个答案适用于 EF4,但不适用于与问题相关的 EF6。【参考方案3】:

我也遇到了这个问题,发现“模型绑定”http://www.asp.net/web-forms/overview/presenting-and-managing-data/model-binding/retrieving-data

这篇文章贯穿了构建“代码优先”数据模型类的过程,但是我只是将 ItemType 切换为通过“数据库中的 EF 设计器...”过程生成的类,它工作得很好。

希望这对仍在搜索的人有所帮助。

迈克

【讨论】:

【参考方案4】:

我从 Sergey 的回答中的这个链接 Entity DataSource not working with Entity Framework 6 Upgrade 了解到,您可以将旧的 EntityDataSource 从工具箱中拖放到设计器中,然后将标签前缀更改为 ef 而不是 asp。 (我在这里找到了Seminda对问题的评论中的链接)。之后,您可以在设计器和属性窗口中继续使用它并且它可以工作。

那里的答案提到,如果您使用 EntityDataSource 的事件,则必须更改背后的代码

来自

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

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

重点是将Microsoft.AspNet.EntityDataSource 添加到EventArgs

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

我希望这可以帮助那些仍然想通过设计器使用 EntityDataSource 而不仅仅是通过标记的人。

【讨论】:

【参考方案5】:

截至 2020 年 4 月和 EF6,您可以使用 nuget 安装 Microsoft.AspNet.EntityDataSource,然后将 DataSource 的标记前缀从 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>

【讨论】:

以上是关于EntityDataSource 和实体框架 6的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有 EntityDataSource 的情况下从 SQL Server 获取数据到 DevExpress FileManager

在插入,更新或删除操作期间,在实体上找不到属性?

参数类型“Edm.Int16”和“Edm.String”与此操作不兼容

实体框架分离实体和相关实体消失

为啥实体框架要复数和大写实体类名?

实体框架 - 分离和重新附加实体?