2011-03-04 2 views
9

J'essaye de créer une première application de code de cadre d'entité simple. J'ai ces classes:Comment obtenir Entity Framework Code Les propriétés de clé étrangère premières et nullables à travailler?

public class User 
{ 
    public int UserId { get; set; } 

    public string Username { get; set; } 

    public virtual ActivationTicket ActivationTicket { get; set; } 
} 

public class ActivationTicket 
{ 
    public int ActivationTicketId { get; set; } 

    public virtual User User { get; set; } 

    public string Ticket { get; set; } 
} 

Lorsque je tente de créer un nouvel utilisateur et l'enregistrer dans la base de données (un utilisateur sans ActivationTicket qui est) Je reçois une exception

L'instruction INSERT en conflit avec la contrainte FOREIGN KEY "ActivationTicket_User". Le conflit s'est produit dans la base de données "Test", la table "dbo.ActivatioTickets", la colonne "ActivationTicketId". La déclaration a été résiliée.

Je suppose EF traite la correspondance entre l'utilisateur et ActivationTicket comme 1-1 mais il devrait être 1-0..1

Que dois-je faire pour que cela fonctionne?

Répondre

20

Vous aurez besoin d'une règle de mappage comme ceci:

 
modelBuilder 
    .Entity<User>() 
    .HasOptional<ActivationTicket>(u => u.ActivationTicket) 
    .WithOptionalPrincipal(); 

Cela vous donnera une table ActivationTickets avec un ID utilisateur qui est annulable.

+0

Je commence juste avec EF donc je ne sais pas trop où mettre cette règle de mappage. Y a-t-il un endroit recommandé où stocker tous ces mappings? – b3n

+2

Vous avez deux options. 1) Mettez-le directement dans une méthode de votre classe qui dérive de DbContext: void prioritaire protégé OnModelCreating (ModelBuilder modelBuilder) - OU - 2) Définissez les mappages dans des classes séparées en utilisant modelBuilder.Configurations.Add (new ...) – anon

+1

Je recommande fortement de définir des mappages dans des classes séparées (définissez YourModelClass_MappingClass qui dérive de EntityTypeConfiguration , et définissez le mappage dans ctor de cette classe, puis vous devez l'initialiser dans l'événement DbContext OnModelCreating comme @anon a écrit dans son commentaire. utiliser des classes séparées car ce serait un vrai bazar de définir le mapping pour toutes vos classes au même endroit – Prokurors

4

@ b3n Il devrait être suffisant pour ce faire, au moins avec VS 2013:

public class User 
{ 
    public int UserId { get; set; } 

    public string Username { get; set; } 

    public int? ActivationTicketId { get; set;} 

    public virtual ActivationTicket ActivationTicket { get; set; } 
} 

Ceci est la partie importante:

public int? ActivationTicketId { get; set;} 

Cela précisera le ForeignKey dans votre « utilisateur "Table pour l'ActivasionTicket et définir que c'est facultatif.

crédits aller à: http://forums.asp.net/t/1948351.aspx?Change+Foreign+Key+to+nullable+using+Code+First#5554732

J'ai eu le même problème et instantanément travaillé pour moi.

Egalement sous forme de note, j'ai marqué toutes mes clés primaires avec l'annotation de données "[Key]". Cela pourrait être nécessaire afin de faire ce travail.

Questions connexes