2017-06-07 2 views
0

je dois interroger l'entité Person avec la propriété enum TargetBookingSystemTypeNhibernate entité de requête à la propriété enum

public class Person : EntityWithTypedId<PersonCompositeId> 
{ 
    public virtual string Key { get; set; } 

    public virtual TargetBookingSystemType TargetBookingSystemType { get; set; } 
} 


public class PersonMap : ClassMap<Person> 
{ 
    public PersonMap() 
    { 
     this.CompositeId(x => x.Id).KeyProperty(y => y.AccountName, "[AccountName]").KeyProperty(y => y.Domain, "[Domain]"); 
     this.Table("Person"); 
     this.Map(x => x.Key).Column("[Key]"); 
     this.Map(x => x.TargetBookingSystemType).Column("[TargetBookingSystemType]");//.CustomType<TargetBookingSystemType>(); 
    } 
} 

public enum TargetBookingSystemType 
    { 
     GoogleCalendarAPIv3 = 1, 
     MSExchange2007 = 2, 
     MSExchange2010 = 3, 
     MSExchange2013 = 4, 
     MSOnline = 5 
    } 

CREATE TABLE [dbo].[Person](
    [Domain] [varchar](3) NOT NULL, 
    [AccountName] [varchar](255) NOT NULL, 
    [Key] [varchar](255) NOT NULL, 
    [TargetBookingSystemType] [nvarchar](20) NULL 
) 

Je sais qu'une solution possible est de changer le type de la propriété à chaîne, mais comment puis-je obtenir qu'utiliser NHibernate Je peux avoir la propriété comme une énumération et obtenir toujours une requête réussie?

Essayé CustomType() mais pas de chance d'obtenir une erreur Input string was not in a correct format.

s'il vous plaît noter que la requête fonctionne quand je commente la ligne avec la cartographie de TargetBookingSystemType

EDIT:

I aimerait avoir un appel à DB et après ce filtrage le résultat basé sur l'énumération. Ce est la méthode avec la requête en utilisant NHibernate:

public IList<Domain.DomainObjects.Entities.Person> GetAllPersons() 
     { 
      IList<Domain.DomainObjects.Entities.Person> list = new List<Domain.DomainObjects.Entities.Person>(); 
      string queryString = "select MR from Person MR"; 
      return this.Session.CreateQuery(queryString).SetCacheable(true).SetCacheRegion("LongTerm").List<Domain.DomainObjects.Entities.Person>(); 
     } 

Comment puis-je obtenir la propriété ENUM dans le résultat aswell?

+0

Vous devez utiliser un smallint comme type pour votre colonne, car les enums sont stockés par leur type sous-jacent (int). De même, si vous choisissez d'autoriser la valeur NULL, vous devez déclarer la propriété TargetBookingSystemType comme nulle. – Jehof

+0

@Jehof merci de le remarquer! Il ne résoudra pas mon problème. – pandemic

+0

Copie possible de [Comment mapper une énumération en tant que chaîne de nhibernate fluide?] (Https://stackoverflow.com/questions/503310/how-do-you-map-an-enum-as -string-in-fluent-nhibernate) –

Répondre

0

Il n'y a pas une solution quand vous avez besoin d'interroger sur l'entité avec ENUM Propriété et colonne nvarchar dans DB.

Les solutions de contournement possibles

Modifier le type de données de la propriété de ENUM à chaîne et de garder la nvarchar dans DB.

public class Person : EntityWithTypedId<PersonCompositeId> 
{ 
    public virtual string Key { get; set; } 

    public virtual string TargetBookingSystemType { get; set; } 
} 

OU

Conserver la propriété ENUM dans ENUM mais changer le type de colonne de nvarchar int comme l'a suggéré. Vous devez également spécifier le CustomProperty<enumType>() dans la classe de mappage ou dans xml.

CREATE TABLE [dbo].[Person](
    [Domain] [varchar](3) NOT NULL, 
    [AccountName] [varchar](255) NOT NULL, 
    [Key] [varchar](255) NOT NULL, 
    [TargetBookingSystemType] [int] NULL) 
2

Je ne pensais pas que NH required quelque chose de spécial pour gérer un type enum?()?

Une fois le type de données sous-jacentes de la colonne est OK (basé sur @ commentaire de Jehof), je pense cette requête est adéquate:

var results = session.Query<Person>().Where(p => p.TargetBookingSystemType == TargetBookingSystemType.MSExchange2010).ToList(); 
+0

Salut, s'il vous plaît vérifier la réponse mise à jour. Votre réponse est une solution possible, mais je voudrais éviter de changer le type dans DB car plus d'applications sont en production atm et je ne peux pas m'assurer que je ne casserai pas autre chose en modifiant la DB. – pandemic

+0

@ pandémie, s'il vous plaît modifier votre question pour refléter cela. [Évitez d'utiliser ** Modifier ** sections] (https://meta.stackoverflow.com/q/350184/1178314) pour cela, il suffit d'ajuster la question pour donner tous vos besoins couramment, sans que votre lecteur ait à les nettoyer de plusieurs les pièces. –