29

我有一个使用 EF codefirst 来持久化数据的 webforms 项目。我想使用 GridView 和 EntityDataSource,以节省编写 CRUD。这可能吗?

我可以将我的 DBContext 转换为 EntityDataSource 期望的 ObjectContext 吗?

这是我尝试过的:

<asp:EntityDataSource ID="OrdersDataSource" runat="server" ContextTypeName="SomeNamespace.Models.ShopDBContext" 
     EnableFlattening="False" EntitySetName="Orders" EntityTypeFilter="Order" EnableDelete="False" 
     EnableUpdate="False" Include="OrderLines" OrderBy="it.Id"> 
</asp:EntityDataSource>

<asp:GridView ID="OrdersGridView" runat="server" AllowPaging="True" AllowSorting="True" 
     AutoGenerateColumns="True" DataKeyNames="Id" DataSourceID="OrdersDataSource" /> 

但是我得到了这个例外:

无法将“SomeNamespace.Models.ShopDBContext”类型的对象转换为“System.Data.Objects.ObjectContext”类型。

4

3 回答 3

74

尝试这个:

var context = new YourDbContext();
var adapter = (IObjectContextAdapter)context;
var objectContext = adapter.ObjectContext;
于 2011-11-10T18:54:57.063 回答
4

试试这个->

protected void OrdersDataSource_ContextCreating(object sender, EntityDataSourceContextCreatingEventArgs e)  
{   
    var context = new YourContext();
    e.Context = ((IObjectContextAdapter)context).ObjectContext;
}
于 2013-02-15T16:06:01.787 回答
2

经过 2 天的挣扎,我发现这个链接对我有很大帮助。我正在使用 VS 2012 并且我在使用 DBContext 时遇到了同样的问题。
根据链接,在 VS2012 中,默认代码生成器已更改为生成 POCO 实体和 DBContext,而不是从 VS2010 中默认的 EntityObject 和 ObjectContext 派生的实体。
在解决方案资源管理器中,在您的实体模型下,您需要删除 tt 模板,然后在设计器中,右键单击设计器表面,然后在属性中将代码生成策略从 None 更改为 Default 以获取基于 EntityObject 的实体和派生的 ObjectContext语境。

于 2013-09-18T11:42:13.783 回答