Entity Framework 7 Fluent API no reconoce IsOptional ()

ef-fluent-api entity-framework entity-framework-core

Pregunta

Actualmente estoy configurando mi base de datos en mi proyecto Asp.Net 5 utilizando la entidad framework 7, anteriormente con EF 6, cuando quería que algunas de mis columnas fueran anulables, usaría:

modelBuilder.Entity<Article>().Property(t => t.ArticleDateModified).IsOptional();

Pero parece que IsOptional ya no es parte de EF7, me preguntaba ¿cómo puedo lograr lo mismo con EF7?

Edit: la respuesta de Marc es correcta, primero pensé que funcionó porque encontré algo que era como IsOptional :

modelBuilder.Entity<Article>().Property(t => t.ArticleDateModified).IsOptional();

Pero después de realizar algunas pruebas sin él, configuró la columna de la base de datos que puede contener nulos porque la marqué como anulable en mi modelo de dominio:

modelBuilder.Entity<Article>().Property(t => t.ArticleDateModified).IsOptional();

También vale la pena notar que cuando hice el DateTime no anulable y usé el IsRequired(false) , obtuve el siguiente error:

La propiedad 'ArticleDateModified' en el tipo de entidad 'Artículo' no se puede marcar como anulable / opcional porque el tipo de la propiedad es 'DateTime' que no es un tipo que acepta valores nulos. Cualquier propiedad se puede marcar como no anulable / requerida, pero solo las propiedades de los tipos anulables y que no forman parte de la clave principal se pueden marcar como anulables / opcionales.

Entonces, me pregunto cuál es el uso de IsRequired(false) aquí si todo lo que tengo que hacer para que una columna de base de datos sea anulable es hacerlo anulable en mi clase de dominio.

Respuesta aceptada

Según la nota en esta página de documentación , parecería que el soporte para hacer esto declarativamente fue rescindido. Esto es:

Una propiedad cuyo tipo de CLR no puede contener nulo no se puede configurar como opcional. La propiedad siempre será considerada requerida por Entity Framework.

El hecho de que esto fue intencional se puede ver en las discusiones de diseño del proyecto que alberga en GitHub, específicamente :

Es decir, una propiedad marcada como anulable admite valores nulos, mientras que una propiedad marcada como no anulable nunca debe contener valores nulos. De esto se deduce que marcar una propiedad que es de un tipo CLR no anulable como permitir nulos no será permitido. Esto es diferente del comportamiento EF6 donde está permitido. [énfasis añadido]


El resultado es, en EF7 un NULL columna implica estrictamente una propiedad mapeada anulable. Si su propiedad es anulable, la columna asociada debe ser NULL menos que la marque o configure con IsRequired .


Respuesta a las ediciones de OP

Eso es interesante, inicialmente no vi la documentación en una IsRequired(bool) . Encontré un punto de discusión al respecto en algunas notas de la reunión de junio que afirman que esto sería el equivalente de IsOptional() de IsOptional() :

.IsOptional (): proporcionaremos esta funcionalidad a través de la llamada Requerido (falso)
.IsRequired (): proporcione Required () con la misma funcionalidad

A pesar de que esta fue la intención original, la decisión de diseño de rescindir el soporte data de octubre. (Por actualización) el intento de establecer IsRequired(false) en una propiedad no anulable produce un error en tiempo de ejecución, en lugar de haber sido eliminado por completo.

Aunque ahora es superfluo, la API no se puede eliminar sin romper el código válido: no se implementó con las IsRequired(bool) separadas IsRequired(bool) e IsRequired() , sino con una única IsRequired(bool required = true) . Si se eliminara y reemplazara con la versión sin parámetros, sería un cambio importante.


Respuesta popular

Em ... Declarar propiedad como nullable?

class Article
{
    public DateTime? ArticleDateModified {get;set;}
}



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué