2009-11-04 5 views
0

Nous avons un grand système qui est lié à sa source de données (Navision) via Unity - nous avons la possibilité de l'échanger et d'avoir notre propre base de données. Nous avons donc jeté un coup d'œil autour et nous aimons vraiment le look de Fluent NHibernate - nous essayons d'obtenir une preuve de concept et d'échanger quelques services.Obtention de NHibernate pour générer un ID de chaîne HiLo

Nous voulons utiliser l'algorithme NHibernates HiLo - Malheureusement, nous avons hérité des identifiants de chaînes de Navision qui préfixent ses identifiants (exemple COL00001) afin de correspondre à l'interface dont nous avons besoin pour utiliser les identifiants de chaînes.

Est-ce que quelqu'un sait comment j'obtenir quelque chose comme ...

Id(x => x.ID).GeneratedBy.HiLo("100"); 

travail où ID est une chaîne? Nous obtenons actuellement l'identité doit être int, long etc

Merci,

Andy

------ ------ Mise à jour

J'ai essayé l'exemple dans la article suggéré mais cette fonctionnalité a été supprimée des versions ultérieures de Fluent NHibernate - il existe cependant un .Custom - mais je n'arrive pas à le faire fonctionner!

public class ManufacturerMap : ClassMap<Manufacturer> 
{ 
    public ManufacturerMap() 
    { 
     Id(x => x.ID).GeneratedBy.Custom(typeof(StringTableHiLoGenerator)); 
     Map(x => x.Name); 
    } 
} 


public class StringTableHiLoGenerator : TableHiLoGenerator 
{ 
    public override object Generate(ISessionImplementor session, object obj) 
    { 
     return base.Generate(session, obj).ToString(); 
    } 
} 

Répondre

5

Enfin fissurés ... Merci pour votre aide - voici la solution dans le cas où quelqu'un est intéressé ...

note: que dans le procédé Configure le IType doit être transmise à la base en tant int.

public class ManufacturerMap : ClassMap<Manufacturer> 
{ 
    public ManufacturerMap() 
    { 
     Id(x => x.ID).GeneratedBy.Custom<StringTableHiLoGenerator>(a => a.AddParam("max_lo", Nexus3General.HiLoGeneratorMaxLoSize.ToString())); 
     Map(x => x.Name); 
    } 
} 

public class StringTableHiLoGenerator : TableHiLoGenerator 
{ 
    public override object Generate(ISessionImplementor session, object obj) 
    { 
     return base.Generate(session, obj).ToString(); 
    } 

    public override void Configure(IType type, System.Collections.Generic.IDictionary<string, string> parms, NHibernate.Dialect.Dialect dialect) 
    { 
     base.Configure(NHibernateUtil.Int32, parms, dialect); 
    } 
} 
4

Je ne pense pas que vous réussirez à faire fonctionner le générateur HiLo standard avec une chaîne. Jetez un oeil à la création d'un générateur d'identifiant personnalisé (qui pourrait être une hilo avec une chaîne):

http://nhforge.org/wikis/howtonh/creating-a-custom-id-generator-for-nhibernate.aspx

Mise à jour concernant la mise à jour

Je ne peux pas trouver toute la documentation appropriée sur ce thème en le wiki couramment. Vous pouvez cependant essayer cette méthode générique plutôt que la méthode que vous utilisez:

Id(x => x.Id).GeneratedBy.Custom<IdentityGenerator>() 

Est-ce que cela fonctionne? Sinon, je pense que votre réponse plus rapide pourrait venir si vous postez sur la liste de diffusion couramment-NHibernate:

http://groups.google.com/group/fluent-nhibernate

+0

merci pour votre aide, mais s'il vous plaît voir la mise à jour à la question, - l'article se réfère à des méthodes qui ont maintenant été retirés de Fluent. –

0

La réponse affichée a également travaillé dans mon cas où j'avais une chaîne comme clé primaire avec personnalisée Id générateur et Nhiberate jetais l'erreur: « type n'est pas un ValueTypeType Nom du paramètre: tapez ».

Questions connexes