2012-02-10 21 views
30

Estoy empezando a jugar con el enfoque de primer código para el marco entidad, principalmente para poder decorar mis propiedades con anotaciones para mostrar en mi vista (de lo contrario, ahora mismo tengo que crear una clase que sea casi idéntica a la que ese marco de entidad generó para mí solo para poder agregar anotaciones y luego copiar los datos de un objeto al siguiente).Stop Entity Framework desde la base de datos modificada

Ahora parece que cuando inicio mi aplicación, intento crear una base de datos.

No quiero el marco de la entidad a alguna vez modificar mi base de datos. No. Nunca. Ni siquiera lo intentes. Realmente no es tan difícil modificar las bases de datos; Me sentiría mucho más cómodo si lo hiciera yo mismo. No necesito un marco para sostener mi mano al diseñar una base de datos.

¿Puedo decirle al framework que deje de intentar modificar mi base de datos? Tengo muchas dudas sobre el uso del código ahora, ya que el hecho de que esté intentando modificar mi base de datos es bastante aterrador. Incluso en el desarrollo, nunca quiero ver que suceda.

¿No tengo suerte?

+1

suena como su modelo no coincide exactamente con su base de datos.Podría intentar usar una copia de su base de datos y señalar a EF en eso. Déjalo crear modifique el DB y compare las diferencias, luego modifique su modelo en consecuencia. También debería echar un vistazo a la clase genérica EntityTypeConfiguration. –

+0

¿Modificar esquema o modificar datos? – jrummell

+0

algunos de nosotros simplemente no confiamos en estas migraciones automáticas y venimos desde la perspectiva de que diseñar y configurar la base de datos es lo suficientemente importante como para que sea perfectamente razonable hacerlo manualmente. Pero quítenme EDMX ... Otra razón para hacer esto: para que un equipo pueda trabajar en el DB mientras que el otro configura las clases/modelos para que coincidan, aproximadamente en paralelo. Y si algo cambia, no tiene que buscar migraciones. Simplemente actualice sus anotaciones, etc. – mmcrae

Respuesta

46

Si no desea EF para crear su base de datos, puede desactivar el inicializador base de datos:

public class SchoolDBContext: DbContext 
{ 
    public SchoolDBContext() : base("SchoolDBConnectionString") 
    {    
     //Disable initializer 
     Database.SetInitializer<SchoolDBContext>(null); 
    } 
    public DbSet<Student> Students { get; set; } 
    public DbSet<Standard> Standards { get; set; } 
} 

Ver http://www.entityframeworktutorial.net/code-first/turn-off-database-initialization-in-code-first.aspx

+1

Puede ponerlo en el constructor estático de la clase de contexto, como en este ejemplo de video: http://msdn.microsoft.com/en-us/data/jj572367 –

+1

no se muestra en el video. mira aquí en su lugar: http://www.entityframeworktutorial.net/code-first/turn-off-database-initialization-in-code-first.aspx importante es no usar esto delante de la base de datos –

+1

Esta respuesta se puede mejorar con dónde agregar este código. –

3

Si desea utilizar EF pero nunca modificar la base de datos, probablemente no desee primero el código. Probablemente quieras algo más como base de datos primero.

http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-model-amp-database-first-walkthrough.aspx

vínculos de los comentarios de respuesta:
http://automapper.codeplex.com/
Getting Started with AutoMapper

editar: no he entendido bien, el objetivo you should reference this answer where the following correct code was given:

If you don't want EF to create your database, you can disable the database initializer

Database.SetInitializer<MyContext>(null); 
+0

Acepto que primero la base de datos * suena * como lo que quiero, pero estoy tratando de evitar el problema de tener que crear una clase que sea casi idéntica al modelo que se genera para mí. Tengo que crear una clase casi idéntica para que pueda decorar las propiedades con anotaciones para mostrarlas en mi vista (por ejemplo, aplicando la validación). Resulta en que tengo que recorrer todos mis objetos "EF" y copiarlos/mapearlos a mi nuevo objeto que lleva las anotaciones. –

+1

Diría que nunca debería pasar los objetos de su modelo db a sus vistas. En general, usted crea otra clase que luego se pasa a su vista que solo contiene las propiedades que están disponibles para esa vista. Luego decoraría esa clase con sus propiedades de validación –

+0

@AnthonyShaw - No he visto muchos ejemplos de personas haciendo eso, pero eso es exactamente lo que estoy haciendo en este momento. Creo que me sentí aprensivo porque parecía mucho trabajo de copiado/mapeo mundano. ¿Hay algún patrón que use para convertir su objeto de modelo de base de datos en un objeto para mostrar en su vista? ¿Cómo lo haces usualmente? –

2

Cuando se declara que está initialiser, utilice la clase base:

public class DatabaseInitialiser : CreateDatabaseIfNotExists<MyContext> 

en lugar de:

public class DatabaseInitialiser : RecreateDatabaseIfModelChanges<MyContext> 

O si utiliza:

Database.SetInitializer<MyContext>(new RecreateDatabaseIfModelChanges<MyContext>); 

reemplazar esto :

Database.SetInitializer<MyContext>(new CreateDatabaseIfNotExists<MyContext>); 
1

Desde code first prácticamente hace exactamente lo que describes, no entiendo tu pregunta.

Si no desea que EF juegue con su base de datos, entonces generate a model de su base de datos existente.

+0

Correcto, pero si genero un modelo de mi base de datos, me faltan las anotaciones de datos que necesito para mostrar los datos en mis vistas. Resulta en mucho trabajo duplicado; esencialmente creando una clase idéntica al modelo que se generó y luego decorando esas propiedades con anotaciones. Estoy tratando de evitar todo el esfuerzo de copiado involucrado con eso. –

+0

Puede decorar clases generadas creando clases parciales o clases de amigos (MetadataAttribute). – jrummell

+0

Hay ejemplos en los que desea hacer Code Second, la base de datos existe, pero las relaciones no lo hacen o su trato con Views, y se requiere un enfoque Code Second. –

Cuestiones relacionadas