Chave estrangeira nula de código de estrutura de entidade

107

Eu tenho um User< Countrymodelo. Um usuário pertence a um país, mas não pode pertencer a nenhum (chave estrangeira nula).

Como faço para configurar isso? Quando tento inserir um usuário com um país nulo, ele me diz que não pode ser nulo.

O modelo é o seguinte:

 public class User{
    public int CountryId { get; set; }
    public Country Country { get; set; }
}

public class Country{
    public List<User> Users {get; set;}
    public int CountryId {get; set;}
}

Erro: A foreign key value cannot be inserted because a corresponding primary key value does not exist. [ Foreign key constraint name = Country_Users ]"}

Shawn Mclean
fonte
Você pode me corrigir gentilmente se eu estiver errado. Uma chave estrangeira é ANULÁVEL por PADRÃO no código primeiro asp.net mvc-5 framework de entidade.
Inquebrável de
1
Se quisermos torná-lo não anulável. precisamos usar API fluente, senão decorar com o atributo "Obrigatório". Estou correcto?
Inquebrável de
2
Se não fizermos isso, a chave estrangeira será padronizada como Nullable
Unbreakable

Respostas:

165

Você deve tornar sua chave estrangeira anulável:

public class User
{
    public int Id { get; set; }
    public int? CountryId { get; set; }
    public virtual Country Country { get; set; }
}
Ladislav Mrnka
fonte
7
o que o virtual faz?
Shawn Mclean
32
O virtual é necessário para o carregamento lento.
Ladislav Mrnka de
2
O Virtual também adiciona controle de alterações, o que nem sempre é desejado. Praticamente a única vez que queremos o virtual é nas coleções, mas YMMV.
Dan VanWinkle
1
@TravisJ user.Country retorna nulo então ... captura a exceção (ideal) ou usa if(eww)
SparK
7
Além disso - isso não parece funcionar para Guidchaves baseadas. (Isso os torna anuláveis, claro, mas salvar um registro no banco de dados com a chave estrangeira definida como nula falha devido a uma restrição de chave estrangeira gerada automaticamente.) :-(
BrainSlugs83
8

Eu prefiro isto (abaixo):

public class User
{
    public int Id { get; set; }
    public int? CountryId { get; set; }
    [ForeignKey("CountryId")]
    public virtual Country Country { get; set; }
}

Porque EF estava criando 2 chaves estrangeiras na tabela do banco de dados: CountryId e CountryId1, mas o código acima corrigiu isso.

user1040323
fonte
6

Estou com o mesmo problema agora, tenho uma chave estrangeira e preciso colocá-la como nullable, para resolver esse problema você deve colocar

    modelBuilder.Entity<Country>()
        .HasMany(c => c.Users)
        .WithOptional(c => c.Country)
        .HasForeignKey(c => c.CountryId)
        .WillCascadeOnDelete(false);

na classe DBContext, desculpe por responder muito tarde :)

Yaman Melhem
fonte