c# nhibernate nhibernate-mapping

c# - nhibernate mapping attributes



Explorando mapeo de nhibernate (1)

Un generador de código necesita extraer y generar algunos metadatos de las asignaciones de nhibernate, me pregunto cómo las relaciones de almacenamiento de nhibernate.

Para la relación de muchos a uno, cómo se almacena el otro lado (de una a una parte)

Modelo de dominio:

public class Person { public Detail {get;set;} } public class Detail { public Person {get;set;} }

Mapa de desplazamiento:

PersistentClass map = _config.GetClassMapping(typeof(Person)); Property prop = map.GetProperty("Detail"); // how to find Associated Property (I.E. ''Detail.Person'')


La configuración y, más ISessionFactory creación de ISessionFactory partir de ella, mantienen la información sobre los datos persistentes. Podrían representar entidades o colecciones.

Aquí podemos ver lo que podríamos obtener sobre cualquier clase persistente:

  • ¿Cómo se obtiene el nombre de columna de la base de datos?

La clase persiste:

var entityType = typeof(TEntity); var factory = ... // Get your ISessionFactory var persister = factory.GetClassMetadata(entityType) as AbstractEntityPersister;

Y también podemos observar coleccionistas persistentes

  • Probar una colección es de muchos a muchos o de muchos a uno

la colección persiste:

// the Abstract collection persister var collectionPersister = factory .GetCollectionMetadata(roleName) as AbstractCollectionPersister; // here we go: var isManyToMany = collectionPersister.IsManyToMany; var isOneToMany = collectionPersister.IsOneToMany;

Entonces, en general, lo que se mapea, se representa como persistencia. Espero eso ayude

AMPLÍE, descubra one-to-one

En función de lo anterior, la búsqueda explícita de one-to-one podría ser como:

var persister = factory.GetClassMetadata(entityType) as AbstractEntityPersister; var propertyNameList = persister.PropertyNames; foreach (var propertyName in propertyNameList) { // many info is in collections, so we need to know the index // of our property var index = persister.GetPropertyIndex(propertyName); // with index, we can work with the mapped type var type = persister.PropertyTypes[index]; // if the type is OneToOne... we can observe if(type is NHibernate.Type.OneToOneType) { Console.Write(type.IsAssociationType); Console.Write(type.IsAnyType); Console.Write(type.IsMutable); Console.Write(type.IsCollectionType); Console.Write(type.IsComponentType); Console.Write(type.ReturnedClass); ... // many other interesting and useful info could be revealed } }