我有一个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;
}
执行此更改后,我摆脱了构建错误,但它导致了其他一些错误。
如果我使用 e.Context =((IObjectContextAdapter)_ctx).ObjectContext; 然后在EntityDatasource中获取实体(var school = (School)e.Entity;
)&# 39;更新事件我失去了导航属性。
我没有找到任何方法可以避免在EntityDatasource中使用ObjectContext。我希望远离ObjectContext,因为它在EF 7中被完全删除。
因此,为了解决所有这些问题,我目前添加了一个页面级上下文对象,如:
private SchooEntities _ctx;
我从EntityDatasource的上下文创建事件中删除了 e.Context =((IObjectContextAdapter)_ctx).ObjectContext; 。我还删除了使用 e.Context 属性进行CRUD操作的现有代码。我使用了页面级上下文(_ctx)变量而不是e.Context,一切正常。所以这证实了罪魁祸首是 e.Context =((IObjectContextAdapter)_ctx).ObjectContext;
如何有效地将DbContext
与EntityDatasource(http://www.nuget.org/packages/Microsoft.AspNet.EntityDataSource/)控件一起使用?
就我的情况而言,为了取回导航属性我会做些什么改变(从eventargs var school = (School)e.Entity;
中检索实体时)?
如果我不使用EntityDataSource控件的e.Context
属性,那么我认为根本没有使用EntityDatasource? (仅供参考:我仅对 Bind 和更新操作使用EntityDatasource控件)
非常感谢任何帮助。
答案 0 :(得分:0)
要确保填充导航属性,您需要在EntityDataSource的[Include]属性中设置要填充为逗号分隔列表的那些。