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
}
}