Não é possível inserir o valor NULL na coluna 'RoleId' (associação simples do mvc4)

Notei que outra pessoa enfrentou o mesmo problema, comoNão é possível inserir o valor NULL na coluna 'UserId' mas deve ser causado por diferentes razões.

O problema pode ser simplificado assim:

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

A última linha de código lançou uma exceção

"Ocorreu um erro ao atualizar as entradas. Veja a exceção interna para detalhes."

e a InnerException estava dizendo a mesma coisa

"Ocorreu um erro ao atualizar as entradas. Veja a exceção interna para detalhes."!

Felizmente, a InnerException da InnerException diz

"Não é possível inserir o valor NULL na coluna 'RoleId', tabela 'MFC.dbo.webpages_UsersInRoles'; coluna não permite nulos. INSERT falha. \ R \ nA instrução foi finalizada."

. o que significa que "RoleId = 3" foi modificado ou ignorado, como isso pode acontecer?

Algum outro código pode ajudar estão listados abaixo:

[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; }
}

e scripts de criação de tabelas:

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])
);

Outra coisa intersting é que eu posso remover um usersInRole do contexto, ou seja, o código a seguir é ok (se eu adicionei o 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 poucas pessoas estão usando e conversando sobre simples associações, portanto, não encontrei muitos recursos úteis do Google. Então, qualquer ajuda será apreciada. Obrigado.

Aqui está a solução:

Como Tommy disse, esse problema é causado pelos atributos [Key]. Em vez de excluir o [Key] (que causará um erro como "o tipo de entidade não possui uma chave definida"), alterei o código para a solução 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 e Roles.RemoveUserFromRole podem fazer isso corretamente. Mas ainda não está terminado ..... Estranhamente, o _userContext.UsersInRoles não pode retornar resultados corretos. Por exemplo, se os dados na tabela forem:

RoleId UserId
5      1
5      2
5      3

Retorna 3 registros (5,1) (5,1) (5,1) em vez de (5, 1) (5, 2) (5, 3). Essa é a coisa que Tommy mencionou em sua resposta, mas ignorada por Roles.Add / Remove (). A solução é: 1. Adicione uma coluna [ID] à tabela:

    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. Adicione a nova coluna à entidade DIREITA SOB A [KEY]:

[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; }
}

Agora eu recebo (5, 1) (5, 2) (5, 3)!

Eu sei pouco sobre banco de dados, mas como Tommy mencionou, isso deve ser causado por declarar RoleId em [Key] [Database ....] com PRIMARY KEY CLUSTERED ([UserId] ASC, [RoleId] ASC) em scripts juntos.

questionAnswers(2)

yourAnswerToTheQuestion