如何在EF 6.1.1中使用DbContext for EntityDatasource

时间:2014-12-04 11:05:05

标签: c# asp.net entity-framework dbcontext entitydatasource

我有一个ASP.NET Web Forms应用程序,它使用.NET framework v4.5和EF v6.1.1。

我正在使用新的EntityDatasource控件来绑定和更新< asp:FormView />。以前,我使用ObjectContext,现在我将其更改为使用DbContext。在此更改后,由于无效的类型转换,我遇到了构建错误:

e.Context = new SchoolEntities();

这很明显,因为EntityDatasource EventArgs e" Context" 属性属于ObjectContext类型,而 SchoolEntities 类型为DbContext

我也使用e.Context属性进行一些CRUD操作,例如:

var school = e.Context.Schools.FirstOrDefault();
e.Context.Departments.Add(...);
e.Context.SaveChanges();

要修复错误,我从DbContext获取了ObjectContext,如下所示:

e.Context = ((IObjectContextAdapter)_ctx).ObjectContext;

此处e是Microsoft.AspNet.EntityDataSource的事件参数。

此外,我添加了 EntityDataSource_ContextCreating()事件来解决类型转换问题:

protected void EntityDataSource_ContextCreating(object sender, Microsoft.AspNet.EntityDataSource.EntityDataSourceContextCreatingEventArgs e)
{
    if (_ctx == null)
        _ctx = new SchoolEntities();
    e.Context = ((IObjectContextAdapter)_ctx).ObjectContext;
}

执行此更改后,我摆脱了构建错误,但它导致了其他一些错误。

问题

  1. 如果我使用 e.Context =((IObjectContextAdapter)_ctx).ObjectContext; 然后在EntityDatasource中获取实体(var school = (School)e.Entity;)&# 39;更新事件我失去了导航属性。

  2. 我没有找到任何方法可以避免在EntityDatasource中使用ObjectContext。我希望远离ObjectContext,因为它在EF 7中被完全删除。

  3. 我尝试了什么

    因此,为了解决所有这些问题,我目前添加了一个页面级上下文对象,如:

    private SchooEntities _ctx;
    

    我从EntityDatasource的上下文创建事件中删除了 e.Context =((IObjectContextAdapter)_ctx).ObjectContext; 。我还删除了使用 e.Context 属性进行CRUD操作的现有代码。我使用了页面级上下文(_ctx)变量而不是e.Context,一切正常。所以这证实了罪魁祸首是 e.Context =((IObjectContextAdapter)_ctx).ObjectContext;

    问题

    1. 如何有效地将DbContext与EntityDatasource(http://www.nuget.org/packages/Microsoft.AspNet.EntityDataSource/)控件一起使用?

    2. 就我的情况而言,为了取回导航属性我会做些什么改变(从eventargs var school = (School)e.Entity;中检索实体时)?

    3. 如果我不使用EntityDataSource控件的e.Context属性,那么我认为根本没有使用EntityDatasource? (仅供参考:我仅对 Bind 更新操作使用EntityDatasource控件)

    4. 非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

要确保填充导航属性,您需要在EntityDataSource的[Include]属性中设置要填充为逗号分隔列表的那些。