c# nhibernate interface mapping fluent

c# - Fluido NHibernate, trabajando con interfaces



mapping fluent (3)

Acabo de cambiar a Fluent NHibernate y me he encontrado con un problema y no he encontrado información al respecto.

Este es el caso:

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

IAddress es una interfaz implementada por una clase llamada Dirección

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

Aquí están mis archivos de mapeo para ambas clases

DIRECCIÓN

public class AddressMap : ClassMap<Address> { 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"); } }

CAMPO

public class FieldMap : ClassMap<Field> { 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(); } }

Entonces, cuando intenté recuperar un objeto de campo de mi base de datos, recibí un error NHibernate que indica que IAddress no está mapeado. ¿Hay alguna forma de especificar a NHibernate para usar la clase Address en la asignación?

Por favor, avíseme si se necesita más información.

Muchas gracias,

Charles


En su objeto Field, tiene un objeto de tipo IAddress. Esto podría implementarse mediante cualquier cantidad de implementaciones diferentes. Con lo que está preguntando, cada implementación tendría su propia asignación, que introduciría cualquier cantidad de dificultades (¿imposibilidades?) Que NHibernate podría manejar.

Un simple ejemplo ayudaría a demostrar. Supongamos que tiene dos implementaciones de direcciones I Address1 y Address2. Cada uno se guarda en su propia tabla, tblAddress1 y tblAddress2. Cuando intenta cargar su objeto Field, todo lo que sabe NHibernate es que tiene algo que implementa IAddress, no sabe qué implementación se mantuvo. ¿Cómo sabría qué mapeo usar para recuperar el objeto hijo para cualquier campo dado?

Estoy seguro de que hay más complicaciones, pero este ejemplo muestra por qué debe tener una asignación para el tipo exacto de objeto que ha declarado.


Encuentro que hay razones válidas para usar una interfaz en lugar de una clase concreta como una propiedad.

Por ejemplo, si su clase Field estaba en un proyecto separado de la clase Address, y no tenía una dependencia en el proyecto de la clase Address del proyecto de la clase Field.

Hay otras maneras de manejar esta situación, pero la manera más simple es a menudo intentar lo que se está haciendo y explícitamente decirle a NHibernate la clase concreta que se debe usar para IAddress.

Ahora puede hacer esto en Fluither NHibernate, así:

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

Desafortunadamente no puedes hacer esto con HasMany o HasManyToMany. No estoy seguro de si esto sería posible debido a la falta de un buen soporte de covarianza en C #.


Si está interesado en desacoplar completamente su ORM de su capa de dominio y hace referencia a las interfaces en toda su capa de datos en lugar de especificar clases concretas, puede implementar un EmptyInterceptor para mapear entre los dos.

Vea mi respuesta here .