¿Hay alguna forma "elegante" de dar a la propiedad específica un valor predeterminado?
Tal vez por DataAnnotations, algo así como:
[DefaultValue("true")]
public bool Active { get; set; }
Gracias.
entity-framework
ef-code-first
default-value
marino-krk
fuente
fuente
this.Active = true;
? Creo que el valor de la base de datos tendrá prioridad cuando se recupere, pero tenga cuidado si se realiza una nueva incorporación y luego se adjunta una entidad para una actualización sin una recuperación primero, ya que el seguimiento de cambios podría ver esto como que desea actualizar el valor. Comente porque no he usado EF en mucho tiempo, y siento que esta es una toma en la oscuridad.public bool Inactive { get; set; }
😉Respuestas:
Puede hacerlo editando manualmente la primera migración de código:
fuente
Active
atrue
la hora de crear unEvent
objeto así. El valor predeterminado siempre estaráfalse
en una propiedad bool no anulable, por lo que, a menos que se cambie, esto es lo que el marco de la entidad guardará en la base de datos. ¿O me estoy perdiendo algo?Ha pasado un tiempo, pero dejando una nota para los demás. Logré lo que se necesita con un atributo y decoré mis campos de clase de modelo con ese atributo como quiero.
Obtuve la ayuda de estos 2 artículos:
Lo que hice:
Definir atributo
En el "OnModelCreating" del contexto
En el SqlGenerator personalizado
Luego, en el constructor Configuración de migración, registre el generador SQL personalizado.
fuente
[SqlDefaultValue(DefaultValue = "getutcdate()")]
en cada entidad. 1) Simplemente eliminemodelBuilder.Conventions.Add( new AttributeToColumnAnnotationConvention<SqlDefaultValueAttribute, string>("SqlDefaultValue", (p, attributes) => attributes.Single().DefaultValue));
2) AgregarmodelBuilder.Properties().Where(x => x.PropertyType == typeof(DateTime)).Configure(c => c.HasColumnType("datetime2").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed).HasColumnAnnotation("SqlDefaultValue", "getdate()"));
Las respuestas anteriores realmente ayudaron, pero solo entregaron parte de la solución. El problema principal es que tan pronto como elimine el atributo Valor predeterminado, la restricción en la columna de la base de datos no se eliminará. Por lo tanto, el valor predeterminado anterior permanecerá en la base de datos.
Aquí hay una solución completa al problema, incluida la eliminación de restricciones de SQL en la eliminación de atributos. También estoy reutilizando el .NET Framework nativo
DefaultValue
atributo .Uso
Para que esto funcione, necesita actualizar IdentityModels.cs y Configuration.cs archivos
Archivo IdentityModels.cs
Agregue / actualice este método en su
ApplicationDbContext
claseArchivo Configuration.cs
Actualice su
Configuration
constructor de clases registrando un generador SQL personalizado, como este:A continuación, agregue la clase de generador de SQL personalizado (puede agregarlo al archivo Configuration.cs o a un archivo separado)
fuente
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
atributo? Si es así, ¿por qué? En mis pruebas parecía no tener ningún efecto dejándolo fuera.Las propiedades de su modelo no tienen que ser 'propiedades automáticas' aunque eso sea más fácil. Y el atributo DefaultValue es realmente solo metadatos informativos. La respuesta aceptada aquí es una alternativa al enfoque del constructor.
vs.
Esto solo funcionará para aplicaciones que crean y consumen datos utilizando esta clase específica. Por lo general, esto no es un problema si el código de acceso a datos está centralizado. Para actualizar el valor en todas las aplicaciones, debe configurar el origen de datos para establecer un valor predeterminado. La respuesta de Devi muestra cómo se puede hacer usando migraciones, sql o cualquier idioma que hable su fuente de datos.
fuente
Lo que hice, inicialicé valores en el constructor de la entidad
Nota: los atributos DefaultValue no establecerán los valores de sus propiedades automáticamente, debe hacerlo usted mismo
fuente
Después del comentario de @SedatKapanoglu, estoy agregando todo mi enfoque que funciona, porque tenía razón, solo usar la API fluida no funciona.
1- Crear generador de código personalizado y anular Generar para un modelo de columna.
2- Asigna el nuevo generador de código:
3- Usa una API fluida para crear la Anotación:
fuente
¡Es sencillo! Solo anote con requerido.
La migración resultante será:
Si desea verdadero, cambie el valor predeterminado a verdadero en la migración antes de actualizar la base de datos
fuente
true
?Admito que mi enfoque escapa al concepto completo de "Código Primero". Pero si tiene la capacidad de cambiar el valor predeterminado en la tabla en sí ... es mucho más simple que las longitudes que tiene que pasar arriba ... ¡Soy demasiado vago para hacer todo ese trabajo!
Casi parece que la idea original de los carteles funcionaría:
Pensé que simplemente cometieron el error de agregar citas ... pero desgraciadamente no hay tanta intuición. Las otras sugerencias fueron demasiado para mí (dado que tengo los privilegios necesarios para entrar en la mesa y hacer los cambios ... donde no todos los desarrolladores lo harán en cada situación). Al final lo hice a la antigua usanza. Configuré el valor predeterminado en la tabla de SQL Server ... Quiero decir, ¡ya es suficiente! NOTA: Realicé una prueba adicional haciendo una migración de bases de datos y actualizaciones y los cambios se atascaron.
fuente
Simplemente sobrecargue el constructor predeterminado de la clase Modelo y pase cualquier parámetro relevante que pueda o no usar. Con esto, puede proporcionar fácilmente valores predeterminados para los atributos. A continuación se muestra un ejemplo.
fuente
Consideremos que tiene un nombre de clase llamado Productos y que tiene un campo IsActive. solo necesitas un constructor de creación:
¡Entonces su valor predeterminado de IsActive es True!
Edite :
si quieres hacer esto con SQL usa este comando:
fuente
En EF core, lanzado el 27 de junio de 2016, puede usar una API fluida para establecer el valor predeterminado. Vaya a la clase ApplicationDbContext, busque / cree el nombre del método OnModelCreating y agregue la siguiente API fluida.
fuente
En .NET Core 3.1 puede hacer lo siguiente en la clase de modelo:
En DbContext OnModelCreating agrega el valor predeterminado.
Resultando en lo siguiente en la base de datos
Nota: Si no tiene nullable (bool?) Para su propiedad, recibirá la siguiente advertencia
fuente
Descubrí que solo usando Auto-Property Initializer en la propiedad de la entidad es suficiente para hacer el trabajo.
Por ejemplo:
fuente
Hmm ... hago DB primero, y en ese caso, esto es realmente mucho más fácil. EF6 ¿verdad? Simplemente abra su modelo, haga clic derecho en la columna para la que desea establecer un valor predeterminado, elija propiedades y verá un campo "Valor predeterminado". Solo complete eso y ahorre. Configurará el código para usted.
Sin embargo, su kilometraje puede variar en el código primero, no he trabajado con eso.
El problema con muchas otras soluciones es que, si bien pueden funcionar inicialmente, tan pronto como reconstruya el modelo, arrojará cualquier código personalizado que haya insertado en el archivo generado por la máquina.
Este método funciona agregando una propiedad adicional al archivo edmx:
Y agregando el código necesario al constructor:
fuente
Establezca el valor predeterminado para la columna en la tabla en el servidor MSSQL y en el atributo de agregar código de clase, de esta manera:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
por la misma propiedad
fuente