remarks name generate example comentarios c# entity-framework entity-framework-4.1 code-first database-first

c# - name - xml doc



Código Primero vs. Base de Datos Primero (3)

Creé un modelo de Entity Framework basado en una base de datos existente, y luego generé las entidades POCO a partir del modelo. La cadena de conexión en mi web.config no es Entity Framework, es solo la cadena de conexión estándar (faltan las referencias CSDL, SSDL, MSL).

Puedo compilar mi aplicación, pero cuando ejecuto recibo este error:

El código generado usando las plantillas T4 para el desarrollo de Database First y Model First puede no funcionar correctamente si se usa en el modo Code First. Para continuar usando Database First o Model First, asegúrese de que la cadena de conexión de Entity Framework esté especificada en el archivo de configuración de la aplicación en ejecución. Para usar estas clases, que se generaron desde Database First o Model First, con Code First agregue cualquier configuración adicional usando los atributos o la API DbModelBuilder y luego elimine el código que produce esta excepción.

Mi pregunta es: ¿en qué parte de mi código se da cuenta de que los POCO provienen de la generación automática y cómo puedo hacer que se comporte como Code First? No quiero hacer referencia a la CSDL, etc. en mi cadena de conexión.


Necesitas lo siguiente en tu archivo de configuración:

<connectionStrings> <add name="<The name of your class>" connectionString="metadata=res://*/<test>.csdl|res://*/<test>.ssdl|res://*/<test>.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=<your source>;initial catalog=<your db>;persist security info=True;user id=<your user id>;password=<your password>;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> </connectionStrings>


Primero uso la base de datos y resolví esto copiando la cadena de conexión generada por EDMX en la aplicación .config de mi aplicación de inicio. Ya existía uno pero aparentemente eran diferentes.


Si la cadena de conexión tiene los metadatos, EF cree que es Modelo primero o Base de datos primero. Si se trata de una cadena de conexión simple, EF piensa que es Código Primero. Sin embargo, si quiere comenzar primero con el modelo, pero haga que EF piense que realmente está haciendo primero el código (que es lo que está haciendo), asegúrese de estar usando el generador de código DbContext, no el predeterminado. Los POCO del código primero son realmente eso: "objetos c # antiguos y sencillos": no hay ninguna base de datos especial que tenga en cuenta o cambie el material de seguimiento en ellos. Para usar el generador de código DbContext, haga clic con el botón derecho en el diagrama de su modelo y elija "Agregar nuevo elemento de generación de código ..." luego seleccione el Generador DbContext de ADO.NET. Además, dependiendo de cómo nombró sus claves primarias y externas y / o si son más complicadas que las simples identificaciones int, es probable que deba completar algún código para asignar las relaciones entre sus objetos en el método "OnModelCreating" en su contexto. Elimine la línea de throw new UnintendedCodeFirstException(); y reemplazarlo con su código de asignación. De lo contrario, es posible que EF no pueda entender todas las relaciones (recuerde que no hay metadatos en los que pueda confiar).

Espero que esto ayude.