24

Tengo un proyecto de formularios web utilizando EF codefirst para conservar los datos. Me gustaría utilizar un GridView y EntityDataSource, para guardar la escritura de CRUD. ¿Esto es posible?Convertir DBContext en ObjectContext para usar con GridView

¿Puedo convertir mi DBContext en un ObjectContext que espera EntityDataSource?

Esto es lo que he intentado:

<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" /> 

Sin embargo puedo obtener esta excepción:

No se puede convertir objeto de tipo 'SomeNamespace.Models.ShopDBContext' al tipo 'System.Data.Objects. ObjectContext '.

+2

posible duplicado de [¿Cómo vincular EF Code First DbContext a Asp.Net DataSource?] (Http://stackoverflow.com/questions/6327937/how-to-bind-ef-code-first-dbcontext-to -an-asp-net-datasource) –

+0

De hecho, es un duplicado, gracias (nota: una búsqueda de "DBContext ObjectContext GridView" encontrará esto pero no la pregunta con una respuesta) – Myster

Respuesta

64

Prueba esto:

var context = new YourDbContext(); 
var adapter = (IObjectContextAdapter)context; 
var objectContext = adapter.ObjectContext; 
+1

Dios ha estado mirando por todas partes para esas líneas . ¡Gracias! – forhas

+2

Esto podría ser una pregunta tonta, pero si 'YourDbContext' hereda 'IObjectContextAdapter', ¿por qué tienes que lanzarlo? ¿No debería 'YourDbContext' crear una instancia de ObjectContext? – Eitan

+1

Porque la interfaz IObjectContextAdapter solo tiene una propiedad (ObjectContext) que se implementa de forma privada en la clase DbContext. Revise este enlace http://stackoverflow.com/questions/792908/what-is-a-private-interface – marianosz

3

prueba este ->

protected void OrdersDataSource_ContextCreating(object sender, EntityDataSourceContextCreatingEventArgs e) 
{ 
    var context = new YourContext(); 
    e.Context = ((IObjectContextAdapter)context).ObjectContext; 
} 
1

Después de 2 días de lucha, he encontrado este link que me ayudó un lot.I estoy trabajando withVS 2012 y Tuve el mismo problema con DBContext.
De acuerdo con el enlace, en VS2012 el generador de código predeterminado se cambió para generar entidades POCO y DBContext en oposición a las entidades derivadas de EntityObject y ObjectContext, que por defecto en VS2010.
En el explorador de soluciones, en su modelo de entidad, debe eliminar plantillas tt y, en el diseñador, hacer clic derecho en la superficie del diseñador y luego en las propiedades cambiar la estrategia de generación de código de Ninguno a Predeterminado para obtener entidades basadas en EntityObject y Contexto derivado de ObjectContext.

Cuestiones relacionadas