8

Por alguna razón estoy recibiendo el siguiente error en la instrucción db.SaveChanges();:¿Por qué esto arroja una excepción de valor NULO?

Cannot insert the value NULL into column 'UserId', table 'XXXXXXXXX_Dev.dbo.Portfolios'; column does not allow nulls. INSERT fails. 
The statement has been terminated. 

código de controlador:

[HttpPost] 
[Authorize] 
public ActionResult Create(Portfolio portfolio) 
{ 
    if (ModelState.IsValid) 
    { 
     portfolio.UserId = (Guid)Membership.GetUser().ProviderUserKey; 
     db.AddToPortfolios(portfolio); 
     db.SaveChanges(); 
    } 
    return View("MyPortfolios"); 
} 

He caminado a través del depurador y el ID de usuario confirmado que se está llenando.

Actualización:

He intentado cambiar db.AddToPortfolios(portfolio);-db.Portfolios.AddObject(portfolio); pero sigue teniendo el mismo problema.

Portfolios es un ObjectSet, ¿Debería utilizar el método Attach()?

+0

¿Es 'UserId' una clave foránea para otra tabla o es la clave principal en su tabla' Portfolio' (o ambas para una relación tal vez de 1 a 1)? ¿Realmente usas EF 4.1? Me pregunto porque 'db' parece ser un' ObjectContext' y no un 'DbContext' en tu código. – Slauma

+0

Tiene razón, estoy usando la versión 4, no la 4.1. Usé un primer acercamiento modelo para crear la base de datos. 'UserId' es la clave principal para' Portfolio'. 'Portfolio' tiene una relación muchos a muchos con otra tabla. Parece que el marco de entidad creó una tabla de unión en la base de datos real para facilitar muchos a muchos. – ZeroDivide

Respuesta

8

sé esta excepción de una sola situación, es decir: UserId no es una columna de identidad en su base de datos, pero en el modelo EF la propiedad correspondiente se marca como tal - que significa que es ya sea explícitamente atribuida con DatabaseGeneratedOption.Identity o implícitamente por convenciones.

El problema es que en este caso EF no enviará el valor de la propiedad al Db (no importa si está configurado o no) porque supone que el DB hará el trabajo para crear un valor de columna. Pero el Db no lo hace, de ahí la excepción.

Solo supongo.

Editar:

Para resolver el problema se debe marcar con UserIdDatabaseGeneratedOption.None.

+0

UserId se establece como 'DatabaseGeneratedOption.Identity'. ¿Debo cambiar esto a algo más? – ZeroDivide

+0

La columna db correspondiente es 'UserId (PK, uniqueidentifier, not null)' – ZeroDivide

+0

@ZeroDivide: Sí, 'DatabaseGeneratedOption.None' es la solución. 'uniqueidentifier'/guid columnas no se autogeneran en SQL Server. – Slauma

Cuestiones relacionadas