2011-07-27 16 views
9

Tengo una columna en la base de datos que no puede ser nula, y quiero establecer que tenga un valor predeterminado en la base de datos. El problema es que el marco de entidad parece crear un valor predeterminado en sí mismo (por ejemplo, int => 0) e ignora por completo la restricción de valor predeterminada en la base de datos.Inhabilitación de la generación de valor predeterminada de Entity Framework (Código primero)

¿Hay alguna manera de deshabilitar esta valoración predeterminada de entidad marco?

Respuesta

3

Nativamente, Entity framework no permite esto. Tienes que hacer un código para eso. This answer from another site parece haber resuelto el problema para muchas personas.

Él "hacks" que (como se dijo) por hacer algo así:

public partial class YourEntityClass { 
    public YourEntityClass() { 
     this.PropertyNameWithDefaultValue = default(int); 
    } 
} 

Nota 1: Alguien menciona que puede que no funcione en EF4

Nota personal: Lo siento por mi Inglés , Por lo general hablo francés.

+1

Actualicé el ejemplo para que sea válido. Esta es la respuesta correcta y funciona en todas las versiones de EF. EF no utiliza los valores predeterminados de la base de datos para las propiedades que se pueden configurar desde su aplicación, es por diseño. –

+0

Gracias @Ladislav por corregir mi respuesta. –

+0

Entonces, no hay forma de hacer lo que yo quería. Gracias por tu respuesta. –

0

Puede actualizar el modelo EDMX para cambiar el valor predeterminado para cualquier columna mediante la ventana Propiedades. Sin embargo, Entity Framework no parece recoger DEFAULT restricciones automáticamente. No estoy seguro si hay una manera de hacerlo.

3

A veces tenemos que hacer manualmente lo que EF no hace automáticamente por nosotros.

En caso de que el uso de EF 4.1 "Código primero", por lo general a crear una clase separada DbInitializer derivado de IDatabaseInitializer, y en la implementación del método InitializeDatabase, a llamar a la

context.Database.ExecuteSqlCommand("ALTER TABLE TABLENAME ... "); 

Ahora en el constructor estático de la clase derivada de DbContext, llame a la inicializador:

Database.SetInitializer(new DbInitializer()); 

de esta manera, es posible especificar cualquier base de datos de los comandos DML/DDL para alterar tablas/columnas sólo para asegurarse de que el PP es como queremos.

+1

Gracias, esto también fue útil. Aún no puedo recibir cupones –

6

He encontrado que puede decorar sus campos con el siguiente atributo.

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
3

Los campos "Computados" en EF no son lo mismo que los campos con valores predeterminados en SQL. Un campo calculado es aquel que se calcula en el servidor y no se debe modificar cuando se envía un objeto. Si coloca una etiqueta calculada en un campo, obtendrá la predeterminada cuando cree el objeto por primera vez, pero luego no podrá cambiar ese campo más adelante. Entonces, si obtiene una entidad de la base de datos que realiza un cambio en un campo calculado y luego llama a "saveChanges()" en el contexto de su entidad, el campo no se verá alterado en la base de datos.

Es mejor utilizar los valores predeterminados de EF al establecer el valor predeterminado para el atributo en el editor de EDMX.

Es un dolor en el trasero que el actualizador EDMX no puede leer los valores predeterminados del campo cuando hay un mapeo uno a uno entre el campo de la entidad y el campo de la base de datos.

+0

Lástima que estábamos usando Code First :( –

Cuestiones relacionadas