2010-07-08 7 views
2

J'essaye de mapper mes collections avec FNHib automapping. Les problèmes que je veux résoudre sont les suivants:Collecte automatique de nhibernate

1) Je souhaite que toutes mes collections du projet soient mappées via un champ privé. Comment puis-je dire cela globalement?

2) Est-il possible d'automatiser les relations bidirectionnelles sans surcharger explicitement chacune de mes entités.

exemple de classe OrganizationEntity:

private ISet<> _collectionWarehouse; 
public virtual IEnumerable<WarehouseEntity> CollectionWarehouse 
{ 

get{return _collectionWarehouse; } 

set{_collectionWarehouse = new HashedSet<WarehouseEntity>((ICollection<WarehouseEntity>)value)} 

} 

exemple classe WarehouseEntity:

public virtual OrganizationEntity Organization{get;set;} 
+0

James Gregory le 12 Mars, 2010 Actuellement, vous ne pouvez pas. L'automapper est très opiniâtre et inflexible, et il s'attend à ce que les collections soient exposées comme IList ou ISet. J'ai dit la même chose dans votre autre question, mais c'est quelque chose que je travaille activement à améliorer. Ce n'est pas beaucoup de consolidation maintenant, je réalise. Encore une fois, vos options sont soit de vivre avec le compromis dans votre domaine (exposer IList), remplacer chaque occurrence, ou ne pas utiliser automapping pour ces classes. http://support.fluentnhibernate.org/discussions/help/37-automapper-doesnt-map-hasmany-collections-which-uses-a-backing-field – mynkow

Répondre

3

Vous pouvez mapper vos collections à un champ privé 'à l'échelle mondiale' avec la convention suivante:

// assumes camel case underscore field (i.e., _mySet) 
public class CollectionAccessConvention : ICollectionConvention 
{ 
    public void Apply(ICollectionInstance instance) { 
     instance.Access.CamelCaseField(CamelCasePrefix.Underscore); 
    } 
} 

Chaque fois que vous voulez définir une préférence automap 'globale' dans FNH, pensez aux conventions . Le vous utilisez le IAutoOverride sur une carte de classe donnée si vous avez besoin.

Comme cela a bien l'ensemble (un HashSet est généralement ce que je veux vraiment aussi) partie, la dernière fois que je devais faire une cartographie, je ne dois faire une dérogation, comme:

public class ActivityBaseMap : IAutoMappingOverride<ActivityBase> 
{ 
    public void Override(AutoMapping<ActivityBase> m) 
    { 
     ... 
     m.HasMany(x => x.Allocations).AsSet().Inverse(); 

    } 
} 

I Je suis d'accord que cela devrait se traduire par une convention, et peut-être que vous pouvez le faire ces jours-ci. S'il vous plaît poster si vous le comprendre.

HTH,
Berryl

CODE D'UTILISER UN HashSet comme ICollection =================

public virtual ICollection<WarehouseEntity> Wharehouses 
{ 
    get { return _warehouses ?? (_warehouses = new HashSet<WarehouseEntity>()); } 
    set { _warehouses = value; } 
} 
private ICollection<WarehouseEntity> _warehouses; 
+0

Eh bien, c'est ce que je veux éviter - en dépassant chaque entité. – mynkow

+0

btw ICollectionConvention ne fonctionne pas même avec IList ou ISet. Y a-t-il un ordre dans lequel je devrais configurer mes alternances, remplacements et conventions? – mynkow

+0

Eh bien, un autre jour sans aucune chance. Hey Berryl, pouvez-vous me donner plus d'indices à ce sujet? – mynkow

Questions connexes