No se puede insertar el valor NULL en la columna 'RoleId' (membresía simple de mvc4)

Noté que alguien más ha enfrentado el mismo problema comoNo se puede insertar el valor NULL en la columna 'UserId' pero debe ser causada por diferentes razones.

El problema se puede simplificar así:

            UsersContext _usersContext = new UsersContext();
            ...
            var usersInRole = new UsersInRole() { RoleId = 3, UserId = 1 };
            _usersContext.UsersInRoles.Add(usersInRole);
            _usersContext.SaveChanges();

La última línea de código lanzó una excepción.

"Se produjo un error al actualizar las entradas. Consulte la excepción interna para obtener más información".

, y la InnerException decía lo mismo

"Se produjo un error al actualizar las entradas. Consulte la excepción interna para obtener más detalles."!

Afortunadamente, la InnerException de la InnerException dice

"No se puede insertar el valor NULL en la columna 'RoleId', tabla 'MFC.dbo.webpages_UsersInRoles'; la columna no permite valores nulos. INSERT falla. \ R \ nLa declaración ha finalizado."

. lo que significa que "RoleId = 3" fue modificado o ignorado, ¿cómo pudo suceder eso?

Algunos otros códigos que podrían ayudar se enumeran a continuación:

[Table("webpages_UsersInRoles")]
public partial class UsersInRole
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int RoleId { get; set; }
    public int UserId { get; set; }
}

public class UsersContext : DbContext
{
    public UsersContext()
        : base("MFCConnectionString")
    {
    }

    public DbSet<UsersInRole> UsersInRoles { get; set; }
}

y scripts de creación de tablas:

CREATE TABLE [dbo].[webpages_UsersInRoles] (
    [UserId] INT NOT NULL,
    [RoleId] INT NOT NULL,
    PRIMARY KEY CLUSTERED ([UserId] ASC, [RoleId] ASC),
    CONSTRAINT [fk_UsersInRoels_RoleId] FOREIGN KEY ([RoleId]) REFERENCES [dbo].[webpages_Roles] ([RoleId]),
    CONSTRAINT [fk_UsersInRoles_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[UserProfile] ([UserId])
);

Otra cosa interesante es que puedo eliminar un UserInRole del contexto, es decir, el siguiente código es correcto (si agregué el registro manualmente):

            UsersContext _usersContext = new UsersContext();
            ...
            var usersInRole = _usersContext.UsersInRoles.SingleOrDefault(i => i.RoleId == 3 && UserId == 1);
            _usersContext.UsersInRoles.Remove(usersInRole);
            _usersContext.SaveChanges();

Parece que pocas personas están usando y hablando de membresía simple, por lo que no he encontrado muchos recursos útiles de Google. Así que cualquier ayuda será apreciada. Gracias.

Aquí está la solución:

Como dijo Tommy, este problema se debe a los atributos [Clave]. En lugar de eliminar la [Clave] (que causará un error como "el tipo de entidad no tiene una clave definida"), cambié el código a una solución oficial:

            foreach (var role in roles)
            {
                foreach (var user in UserProfile.GetAllUserProfiles(_usersContext))
                {
                    var usersInRole = _usersContext.UsersInRoles.SingleOrDefault(uio => uio.RoleId == role.RoleId && uio.UserId == user.UserId);
                    var key = user.UserId + "_" + role.RoleId;
                    if (collection.AllKeys.Any(i => i == key) && collection[key].Contains("true") && usersInRole == null)
                    {
                        Roles.AddUserToRole(user.UserName, role.RoleName); //Key codes!
                    }
                    if (collection.AllKeys.Any(i => i == key) && !collection[key].Contains("true") && usersInRole != null)
                    {
                        Roles.RemoveUserFromRole(user.UserName, role.RoleName); //Key codes!
                    }
                }
            }

Parece que Roles.AddUserToRole y Roles.RemoveUserFromRole pueden hacerlo correctamente. Pero aún no está terminado ... Extrañamente, _userContext.UsersInRoles no puede devolver los resultados correctos. Por ejemplo, si los datos en la tabla son:

RoleId UserId
5      1
5      2
5      3

devuelve 3 registros (5,1) (5,1) (5,1) en lugar de (5, 1) (5, 2) (5, 3). Esto es lo que Tommy mencionó en su respuesta, pero que Roles.Add / Remove () omite. La solución es: 1. Agregue una columna [ID] a la tabla:

    CREATE TABLE [dbo].[webpages_UsersInRoles] (
        [ID] INT NOT NULL IDENTITY, --Key codes!
        [UserId] INT NOT NULL,
        [RoleId] INT NOT NULL,
        PRIMARY KEY CLUSTERED ([UserId] ASC, [RoleId] ASC),
        CONSTRAINT [fk_UsersInRoels_RoleId] FOREIGN KEY ([RoleId]) REFERENCES [dbo].[webpages_Roles] ([RoleId]),
        CONSTRAINT [fk_UsersInRoles_UserId] FOREIGN KEY ([UserId]) REFERENCES [dbo].[UserProfile] ([UserId])
    );

2. Agregue la nueva columna a la entidad DERECHA BAJO LA [CLAVE]:

[Table("webpages_UsersInRoles")]
public partial class UsersInRole
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; } //Key codes!
    public int RoleId { get; set; }
    public int UserId { get; set; }
}

¡Ahora obtengo (5, 1) (5, 2) (5, 3)!

Sé poco acerca de la base de datos, pero, como mencionó Tommy, esto debería deberse a la declaración de RoleId bajo [Key] [Database ...] con CLUSTERED (CLI) [PRIMIUDAS DE USUARIO], [ASC [RoleId]] de caracteres [CLI] [CLI]].

Respuestas a la pregunta(2)

Su respuesta a la pregunta