2014-05-13 2 views
2

je la structure de tableau suivant:relation one-to-Zero dans le code-première

utilisateur:
UserId
Nom
CountryId

Pays
CountryId
Nom

où CountryId dans table user est une clé foeign de la table Country.
Dans le code, j'ai les entités suivantes:

public class User 
{ 
    public int Id{get; set;} 
    public int CountryId {get; set;} 
    public virtual Country Country {get; set;} 
    public string Name {get; set;} 
} 



public class Country 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
} 

Tableau Pays stocke une liste de 10 pays disponibles un utilisateur peut appartenir. Ne me tuez pas pour le modèle de base de données, il doit être de cette façon, les problèmes hérités.

La relation sont définis comme suit par l'api couramment:

modelBuilder.Entity<User>() 
     .HasRequired<Country>(c => c.Country) 
     .WithMany() 
     .HasForeignKey(c => c.CountryId); 

Le problème est à chaque fois que je tente d'insérer un nouvel utilisateur dans la db, le modèle défini tente d'insérer une nouvelle entrée dans le pays table bien et je reçois l'erreur suivante:

Cannot insert the value NULL into column 'id', table '.countries'; column does not allow nulls. INSERT fails.\r\nThe statement has been terminated.

Pourquoi ef tente d'insérer un nouvel enregistrement dans la table des pays aussi bien et comment puis-je résoudre ce problème pour n'insérer un nouvel utilisateur et mettre à jour le pays utilisateur de la liste des pays déjà existants?

+0

Pouvez-vous montrer le code qui est l'insertion de l'utilisateur? –

+0

vous aviez raison.le problème était lors de l'insertion de l'utilisateur, au lieu de faire quelque chose comme: var pays = ctx.Countries.FirstOrDefault (c => c.Id == countryId); user.Country = pays; Je faisais user.Country = new Country {Id = countryId; Name = "bla"}, ce qui était incorrect car je créais un nouveau pays. – Elena

+1

Cool cool. Pour l'enregistrement, vous n'avez pas besoin de sélectionner le pays du contexte, vous pouvez simplement définir 'user.CountryId = countryId'. –

Répondre

0

Essayez ceci:

modelBuilder.Entity<User>() 
    .HasOptional<Country>(c => c.Country) 
    .WithMany() 
    .HasForeignKey(c => c.CountryId); 
2

Ce qui est le plus probable est que se passe vous soit l'ajout d'un utilisateur sans un pays: -

var user = new User() 
{ 
    Name = "Elena" 
}; 
db.Users.Add(user); 

Si tel est le cas, vous devrez assurez-vous que vous pouvez en fait ajouter un utilisateur sans pays.

D'abord, vous aurez besoin de changer votre configuration API couramment: -

modelBuilder.Entity<User>() 
    .HasOptional<Country>(c => c.Country) 
    .WithMany() 
    .HasForeignKey(c => c.CountryId); 

Vous aurez également besoin de rendre la propriété CountryId sur l'utilisateur annulable: -

public class User 
{ 
    public int Id{get; set;} 
    public int? CountryId {get; set;} 
    public virtual Country Country {get; set;} 
    public string Name {get; set;} 
} 

Ou vous êtes faire quelque chose de bizarre lorsque vous créez l'utilisateur à insérer, par exemple: -

var user = new User() 
{ 
    ... 
    Country = new Country() ... // This will create a new country! 
}; 

Si c'est le cas, vous voulez lier l'utilisateur à un pays existant au lieu: -

var user = new User() 
{ 
    ... 
    CountryId = countryId 
}; 
0

essayez ceci:

public class Country 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
    public ICollection<User> Users { get; set; } 
} 

et:

modelBuilder.Entity<User>() 
    .HasOptional<Country>(c => c.Country) 
    .WithMany(c=>c.Users) 
    .HasForeignKey(c => c.CountryId);