2012-06-04 33 views
9

que tienen un modelo con clave compuesta - la fila es la clave:Entity Framework: campo de clave compuesta no puede ser anulable?

public class Item 
{ 
    [Key, Column(Order = 0)] 
    public int UserId { get; set; } 
    [Key, Column(Order = 1)] 
    public DateTime? Date { get; set; } 
} 

Ejecutar el código de abajo se produce una excepción DbEntityValidationException con el mensaje: The Date field is required.:

var it = new Item { Date = null, UserId = 2 }; 
m_Entities.Items.Add(it); 
m_Entities.SaveChanges(); // throws exception 

(m_Entities es habitual DbContext descendiente con elementos definidos como DbSet<Item>) ¿Por qué es necesario el Date si puede ser null (declarado como DateTime?)? ¿Y cómo permitir que null sea un valor válido para Date?

Respuesta

8

Respuesta de Raphael llevarme a otra búsqueda. Aquí es la razón por la que no es posible (respuesta de Cobsy):

What's wrong with nullable columns in composite primary keys?

En resumen: NULL == NULL -> false

raro. La solución para mí es agregar una columna Id en el Modelo.

Por cierto:. MySQL permite a mí, no para definir la clave principal, entonces yo estoy autorizado a tener tal esquema - EF se queja de no definir la clave :-(

1

No es posible. Todo requisito de RDBMS es que esa clave primaria no debe contener nulos.

+2

Bueno, la clave principal es {UserId Fecha} donde se asegura que solo la fecha es nulable, entonces ¿por qué no es posible? No está de acuerdo con su declaración. Sin embargo, el código es una especie de puerto de PHP/MySQL donde fue posible ... – Zoka

2

No es posible con el servidor Sql u Oracle para cualquier parte de una clave principal.

Pero puede tener una restricción única en estos datos.

Lo que significa que puede tener un tiempo de

UserId = 2, Date = null 

Entonces

UserId = 2, Date = <NOT NULL> 

No se puede crear restricciones directamente únicos con Código En primer lugar, pero mira SMO.

Cuestiones relacionadas