2012-01-13 23 views
13

Lo siento por mi inglés.¿Por qué EF intenta insertar NULL en la columna id?

Estoy escribiendo mi proyecto utilizando Entity Framework 4.0 (modelo primero). Al comienzo del proyecto, que se enfrentan a este problema: Estoy tratando de insertar el objeto relleno en la base de datos, pero me da una excepcion:

"No se puede insertar el valor NULL en la columna 'categoryId', mesa 'ForumDB.dbo.Categories'; la columna no permite nulos. INSERT falla, la instrucción ha finalizado. "

Category usingCategory = new Category("Using Forums", "usingforums", 0); 
    using (Context) 
    { 
     Context.Categories.AddObject(usingCategory); 
     Context.SaveChanges(); 
    } 

comprobado que este objeto, y estoy seguro de que está lleno.

Por si acaso:

public Category(string name, string urlName, int index) 
{ 
    CategoryId = Guid.NewGuid(); 
    Name = name; 
    UrlName = urlName; 
    CategoryIndex = index; 
} 

Por favor, dime lo que está pasando? ¡Gracias por cualquier ayuda!

+0

¿qué tipo de datos es su ID de categoría? – Kyle

+0

@Kyle, guid (uniqueidentifier). –

Respuesta

24

Eche un vistazo a esto: https://stackoverflow.com/a/5338384/171703 - entity framework podría estar suponiendo que su campo CategoryId es una identidad y, por lo tanto, pasa nulo a la base de datos esperando que lo complete.

+1

Es bueno, pero utilizo el modelo primero, pero en esta pregunta el problema se ha resuelto en el ámbito del código primero. –

+0

@KovpaevAlexey La respuesta aceptada en esa pregunta es para el código primero, pero la respuesta específica relacionada en esa pregunta es para el modelo primero. – hvd

+0

@hvd, este problema se solucionó cuando agregué el ID de generación en el lado de la base de datos. –

14

Me encontré con esto hoy y tuve que regenerar mis clases EF de la base de datos.

Después de hacer eso, me pareció que EF ha añadido:

[DatabaseGenerated(DatabaseGeneratedOption.None)] 
public int Id { get; set; } 

a este campo "ID" que solía ser una columna de identidad en el SQL, pero fue cambiado para ser asignado aplicación.

Creo que si usted no tiene ese atributo EF en realidad no enviar el ID de la base de datos ('convención sobre configuración')

+1

Funcionó para mí también: no fue necesario regenerar las clases, solo agregué el atributo a la propiedad y funcionó. – sluiper

+0

funcionó para mí también ... muchas gracias – Steph8

3

que había creado la mesa con int Id como PK, pero había olvidado para establecer "Especificación de identidad" = verdadero

+0

¡Hiciste mi día! – Hari

Cuestiones relacionadas