2017-09-19 1 views
0

Mon objet Emails dans mon modèle de données a une relation à EmailTemplates mais comme un e-mail ne pas BESOIN d'avoir un modèle associé, je veux la relation autoriser les valeurs nulles, donc je l'ai mis en place la propriété en Email comme virtuelle:code première propriété virtuelle pour relation construit toujours avec une colonne non annulable

public class Email 
{ 
    public int Id { get; set; } 
    public virtual EmailTemplate EmailTemplate { get; set; } 
} 

Cela n'a malheureusement pas encore défini la colonne EmailTemplateId générée pour la relation FK comme annulable donc chaque fois que j'essaie d'ajouter un e-mail qui n » t utiliser un template, mon instruction insert viole la contrainte.

EmailTemplateId column should accept null values

Comment puis-je modifier mon modèle de données pour permettre des valeurs NULL cette relation?

+1

Ajouter explicitement cette propriété: 'publique int? EmailTemplateId {get; set;} 'ou modifiez manuellement la migration. Et «virtuel» ne parle pas de ça. –

+0

Le modificateur 'virtual' n'a aucune incidence sur les propriétés requises ou non. Mais d'après ce que je vois, EF devrait rendre le FK nullable parce que c'est la valeur par défaut. Y a-t-il des mappages supplémentaires? –

+0

@GertArnold non, je n'utilise pas Fluent ou quoi que ce soit (cela me rend confus). S'en tenir aux conventions de nommage pour obtenir toute la cartographie faite. – Ortund

Répondre

0

Le modificateur virtual n'a aucune incidence sur les propriétés soit nécessaire ou non. Vous pouvez obtenir ce que vous voulez en ajoutant une clé étrangère annulable (int?) Propriété:

public class Email 
{ 
    public int Id { get; set; } 

    [ForeignKey("EmailTemplate")] 
    public int? EmailTemplateId { get; set; } 
    public virtual EmailTemplate EmailTemplate { get; set; } 
} 

L'alternative est d'ajouter un mappage dans OnModelCreating override du contexte:

modelBuilder.Entity<Email>() 
    .HasOptional(m => m.EmailTemplate) 
    .WithMany().Map(m => m.MapKey("EmailTemplateId"));