c# - Entity Framework CTP 4. "No se puede insertar el valor NULL en la columna"-Aunque no hay ningĂșn valor NULL
entity-framework ctp4 (6)
Estoy usando EF CTP 4. Tengo una aplicación de consola simple (para fines de prueba) que usa EF para insertar algunos datos en una base de datos SQL.
He llegado a un problema donde al insertar el elemento
using(var context = GetContext())
{
BOB b = new BOB();
b.Id = 1;
context.Bobs.Add(b);
context.SaveChanges();
}
Lanza el error: {"No se puede insertar el valor NULL en la columna ''Id'', la tabla ''TestDB.dbo.BOB''; la columna no permite nulos. INSERT falla. / R / nLa declaración ha finalizado."}
La Tabla solo tiene 1 campo de Id int NOT NULL, que es la clave principal y no es un Id autoincrementado.
En la creación del DataContext tengo esta configuración, que sí se dispara.
protected override void OnModelCreating(ModelBuilder builder)
{
builder.Entity<BOB>().HasKey(b => b.Id);
builder.Entity<BOB>().MapSingleType().ToTable("BOB");
}
También rellené esta tabla previamente y luego, a través del depurador, pude ver cargando este objeto BOB ... así que estoy realmente perplejo, ya que para poder cargar mi BOB muestra que todo está bien ... sin embargo al insertar uno nuevo, se bloquea ...
¿Has intentado especificar explícitamente StoreGeneratedPattern
?
modelBuilder.Entity<BOB>()
.HasKey(p => p.Id)
.Property(p => p.Id)
.StoreGeneratedPattern = StoreGeneratedPattern.None;
builder.Entity<BOB>().MapSingleType().ToTable("BOB");
Estoy usando EF 4.1, Model First y encontré este problema. Así es como lo resolví:
Al usar la superficie del Diseñador de Modelos, cuando crea una Entidad, debe definir una propiedad ''Clave'', por defecto es Id, int32.
En mi situación, he elegido usar Guids para Id, así que cambiaría el int32 a Guid. Pero si examina este ID después de crear la entidad, vi que el ''StoreGeneratedPattern'' del Id tenía seleccionada la ''identidad''. Al principio, no pensé que eso fuera un problema, pero cuando examiné el SQL que se usaba para insertar en la base de datos, era un poco extraño porque no enviaba mi Id. ¡Frustrante!
Pero una vez que volví y cambié el ''StoreGeneratedPattern'' de ''identity'' a ''none'', regeneré el db y reconstruí el proyecto, esta extraña {"No se puede insertar el valor NULL en la columna ''Id'', tabla ''TestDB.dbo.BOB ''; column no permite valores nulos. INSERT falla. / r / nLa instrucción ha finalizado. "} dejó de suceder.
FYI - al ver el sql un poco más, parece que si tiene ''identidad'' elegida para ''StoreGeneratedPattern'', el EF guarda el objeto en el db (sans Id), luego inmediatamente recupera la identidad y la guarda de nuevo en su objeto. es decir, esta opción para ''StoreGeneratedPattern'' depende de la base de datos para generar su Id, ¡ NO su código!
Me sucedió cuando tenía una clave principal faltante en la columna respetada (la columna de identidad) en el esquema del DB. Exporté datos entre servidores SQL, usando la herramienta de exportación SSMS y creando una nueva base de datos, pero no me di cuenta de que está exportando solo los datos, sin claves.
Sé que esta pregunta está fechada de alguna manera y ya se ha encontrado una solución aceptada, sin embargo, pensé que sería útil si comparto mis hallazgos.
Tuve este error hoy porque estaba usando dos instancias diferentes del mismo DataContext
. Estaba creando un nuevo modelo con algunas propiedades: los valores de estas propiedades se cargaron desde la base de datos usando una instancia de DataContext
, luego SaveChanges()
insertar este modelo recién creado en la base de datos llamando primero a Add()
y luego a SaveChanges()
en una diferente instancia de DataContext
. Después de que comencé a usar la misma instancia para obtener los valores de las propiedades y, de hecho, agregar y guardar el nuevo objeto, todo comenzó a funcionar.
Tengo el mismo problema aquí y es realmente una solución fea.
[Key]
public Int64 PolicyID { get; set; }
este NO es un número generado automáticamente
entonces pego el mismo error.
EF Code First CTP5
después de aplicar esto:
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public Int64 PolicyID { get; set; }
entonces funcionará.
Tuve una situación similar, pero en mi caso, incluso off
Identity
no ayudó.
El problema estaba relacionado con la Clave principal, que me he perdido para agregar en mi Modelo de entidad.
Aquí está el script que estaba generando el modelo:
CREATE TABLE [im].[SomeGroup]
(
[Id] INT NOT NULL IDENTITY(1,1), -- this is mandatory for EF
[OtherGroupId] INT NOT NULL,
[Title] NVARCHAR(512) NOT NULL
)
El código de C # para arriba es:
Insert(new SomeGroup
{
// I''m not providing Id here, cause it will be auto-generated
SomeGroupId = otherGroup.Id,
Title = otherGroup.Title
});
Here hay también una explicación de eso.