NHibernate Fluent, travaillant avec des interfaces

Je viens de passer à Fluent NHibernate et j’ai rencontré un problème et je n’ai trouvé aucune information à ce sujet.

Voici le cas:

public class Field : DomainObject, IField { public Field() { } public virtual ssortingng Name { get; set; } public virtual ssortingng ContactPerson { get; set; } public virtual bool Private { get; set; } public virtual IAddress Address { get; set; } } 

IAddress est une interface implémentée par une classe nommée Address

 public class Address : DomainObject, IAddress { public Address() { } public virtual ssortingng City { get; set; } public virtual ssortingng Country { get; set; } public virtual ssortingng PostalCode { get; set; } public virtual ssortingng StreetAddress { get; set; } } 

Voici mes fichiers de mappage pour les deux classes

ADRESSE

 public class AddressMap : ClassMap
{ public AddressMap() { WithTable("Addresses"); Id(x => x.Id, "Id").Access.AsCamelCaseField(Prefix.Underscore).GeneratedBy.Guid(); Map(x => x.City, "City"); Map(x => x.Country, "Country"); Map(x => x.PostalCode, "PostalCode"); Map(x => x.StreetAddress, "StreetAddress"); } }

CHAMP

 public class FieldMap : ClassMap { public FieldMap() { WithTable("Fields"); Id(x => x.Id, "Id").Access.AsCamelCaseField(Prefix.Underscore).GeneratedBy.Guid(); Map(x => x.Name, "Name"); Map(x => x.ContactPerson, "ContactPerson"); Map(x => x.Private, "Private"); References(x => x.Address, "AddressId").Cascade.Delete().Cascade.SaveUpdate(); } } 

Ainsi, lorsque j’essaie de récupérer un object de champ de ma firebase database, une erreur NHibernate s’affiche, indiquant que l’adresse IAddress n’est pas mappée. Existe-t-il un moyen de spécifier à NHibernate d’utiliser la classe Address dans le mappage?

S’il vous plaît laissez-moi savoir si plus d’informations sont nécessaires.

Merci beaucoup,

Charles

Je trouve qu’il existe des raisons valables pour utiliser une interface plutôt qu’une classe concrète en tant que propriété.

Par exemple, si votre classe Field était dans un projet distinct de la classe Address et que vous n’aviez pas de dépendance sur le projet de la classe Address à partir du projet de la classe Field.

Il existe d’autres moyens de gérer cette situation, mais le plus simple est souvent d’essayer de le faire et d’expliquer explicitement à NHibernate la classe concrète à utiliser pour IAddress.

Vous pouvez maintenant le faire dans NHibernate Fluent, comme ceci:

 References(x => x.Address, "AddressId") .Class(typeof(Address); 

Malheureusement, vous ne pouvez pas faire cela avec HasMany ou HasManyToMany. Je ne sais pas si cela serait possible en raison du manque de prise en charge de la covariance en C #.

Sur votre object Field, vous avez un object de type IAddress. Cela pourrait être mis en œuvre par un nombre quelconque d’implémentations différentes. Avec ce que vous demandez, chaque implémentation aurait sa propre cartographie, ce qui présenterait un certain nombre de difficultés (impossibilités?) À gérer par NHibernate.

Un exemple simple aiderait à démontrer. Supposons que vous avez deux implémentations IAddress Address1 et Address2. Ils sont chacun enregistrés dans leur propre table, tblAddress1 et tblAddress2. Lorsque vous essayez de charger votre object Field, tout ce que NHibernate sait, c’est que quelque chose qui implémente IAddress est implémenté. Il ne sait pas quelle implémentation a été persistée. Comment pourrait-il savoir quel mappage utiliser pour extraire l’object enfant d’un champ donné?

Je suis sûr qu’il y a plus de complications, mais cet exemple montre pourquoi vous devez avoir un mappage pour le type d’object exact que vous avez déclaré.

Si vous souhaitez dissocier entièrement votre ORM de votre couche de domaine et référencer des interfaces dans votre couche de données plutôt que de spécifier des classes concrètes, vous pouvez implémenter un EmptyInterceptor pour mapper les deux.

Voir ma réponse ici .