2016-09-08 2 views
0

J'ai un certain nombre de types qui héritent de l'interface « IEventReportElement », qui expose la propriété « IdEventReport »:Avoir la configuration de propriété spécifique pour tous les types qui mettent en œuvre une interface à l'exception d'un

public interface IEventReportElement 
{ 
    long Id { get; set; } 
    long? IdEventReport { get; set; } 
} 

C'est un nullable, car je ne suis pas toujours capable de le remplir correctement tout de suite, mais ne devrait pas être nul dans la base de données.

est pourquoi j'ai ajouté la ligne

modelBuilder.Types<IEventReportElement>().Configure(x=>x.Property(y=>y.IdEventReport).IsRequired()); 

à ma méthode de OnModelCreating dans le DbContext. Toutefois, le type 'Position' doit implémenter cette interface, mais ne doit PAS avoir la colonne pour la propriété 'IdEventReport' dans la base de données, mais une colonne pour la propriété 'IdParent' qu'il expose.

public class Position : BOBase, IEventReportElement 
{ 
    public long? IdEventReport 
    { 
     get { return IdParent; } 
     set { IdParent = value; } 
    } 

    public long? IdParent { get; set; } 
} 

et la section du Modelbuilder

 modelBuilder.Entity<Position>().Property(x => x.IdParent).IsRequired(); 
     modelBuilder.Entity<Position>().Ignore(x => x.IdEventReport); 

Cependant, cela jette une exception déjà en essayant de créer la base de données:

System.InvalidOperationException: La propriété 'IdEventReport' est pas une propriété déclarée sur le type "Position". Vérifiez que la propriété n'a pas été explicitement exclue du modèle en utilisant la méthode Ignore ou l'annotation de données NotMappedAttribute. Assurez-vous que c'est une propriété primitive valide.

Bien que cela puisse être valide, n'est-il pas possible de remplacer la configuration Type donnée pour un type spécifique? Dois-je ajouter la ligne .IsRequired() à tous les autres types qui implémente cette interface, ou existe-t-il un autre moyen de surmonter cela?

+0

Je suppose que vous essayez de sélectionner 'Position.IdEventReport' dans la requête. est-ce correct? –

+0

non, IdEventReport ne doit pas être inclus dans le modèle. IEventReportElement a d'autres propriétés importantes que je veux utiliser, je ne veux tout simplement pas utiliser cette propriété (dans la base de données). – DevilSuichiro

Répondre

0

J'ai trouvé une solution, mais ce n'est pas très bien. Je l'ai fait en modifiant la ligne de la configuration de type à

modelBuilder.Types<IEventReportElement>().Where(x=>x.Name!="Position").Configure(x=>x.Property(y=>y.IdEventReport).IsRequired()); 
0

Si vous voulez simplement que la colonne ait un nom différent dans la base de données, utilisez HasColumnName.

Pour accéder à IdParent dans le modèle C#, utilisez [NotMapped] pour indiquer à EF d'ignorer cette propriété lors de la création de la base de données. En guise de remarque, pourquoi implémentez-vous une interface que vous ne souhaitez pas utiliser? Peut-être que vous pouvez diviser l'interface en plus petites parties et ne mettre en œuvre que ce que vous allez utiliser.

+0

Ce n'est pas ce que je veux, comme je veux interroger la table par la propriété IdParent, ce n'est pas possible avec cette approche. – DevilSuichiro