isessionfactory fluently .net nhibernate fluent-nhibernate nhibernate-mapping

.net - fluently - Fluido NHibernate+mĂșltiples bases de datos



nhibernate c# (4)

Mi proyecto necesita manejar tres bases de datos, eso significa tres fábricas de sesión. La cuestión es si hago algo como esto con nhibernate fluido:

.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))

las fábricas recogerían todas las asignaciones, incluso las que corresponden a otra base de datos

He visto que al usar la automatización puedes hacer algo como esto y filtrar por espacio de nombres:

.Mappings(m => m.AutoMappings.Add( AutoMap .AssemblyOf<Product>() .Where(t => t.Namespace == "Storefront.Entities")))

No he encontrado algo como esto para mapeos fluidos, ¿es posible? Las únicas soluciones que se me ocurren son: crear ensamblajes separados para cada clase de asignación de db o agregar explícitamente cada una de las entidades a la configuración de fábrica.

Preferiría evitar ambos, si es posible. Gracias.


También puede filtrar por tipos. Aquí hay una línea de código comentado de un "campo verde" AutoPersistenceModel que uso en el mismo ensamblaje que un "campo marrón uno" (es decir, dos bases de datos). Pero solo hay un tipo que necesito filtrar, así que no me he molestado en dividir un ensamblaje heredado. Si tiene muchos de ellos por db, entonces dividirlos por conjuntos probablemente sea la mejor OMI.

Sería genial si FNH pudiera proporcionar algún tipo de soporte multi-db incorporado, pero no sé cómo se podría hacer eso realmente; algún tipo de diccionario de SessionFactories tal vez, pero cada situación es única.

HTH,
Berryl

/// <summary> /// This would simply call <see cref="AutoMapHelpers.GetAutoMappingFilter"/> but we need to /// exclude <see cref="LegacyProject"/> also for now. /// </summary> private static bool _getIncludedTypesFilter(Type t) { return _isNotLegacy(t) && AutoMapHelpers.GetAutoMappingFilter(t); } private static bool _isNotLegacy(Type t) { return !t.Equals(typeof(LegacyProject)); }


La manera más fácil de hacerlo es poner el nombre de la base de datos en el esquema

public sealed class CustomerMapping: ClassMap<Customer> { public CustomerMapping() { Schema("Northwind.dbo"); Table("Customer"); } } public sealed class Customer2Mapping: ClassMap<Customer2> { public CustomerMapping() { Schema("Northwind2.dbo"); Table("Customer"); } }

Luego, siempre que todas las tablas estén accesibles en la misma cadena de conexión, solo necesita una sesión de fábrica


Aunque es una respuesta muy tardía, le sugiero que revise la siguiente URL que, de hecho, tiene alguna solución que resolver y, por lo tanto, puede encontrar la solución en las respuestas. Aquí está la solución a su respuesta que se implementó con la ayuda de url

Con la solución implementada por mí, solo puede implementar el primer modelo de base de datos a partir de ahora. Intente evitar el método GenerateSchema en la pregunta que publique en la URL mencionada, porque todavía no está implementado como si usara ese método, podrá ver las múltiples bases de datos con las mismas tablas y relaciones creadas.


Implementé exactamente esto usando (mi propio) Atributo en el archivo de mapeo Fluent para dictar a qué DB pertenece la entidad. También tengo un concepto de una base de datos ''predeterminada'', y se supone que los archivos de mapeo sin un atributo residen en la base de datos predeterminada (puede reducir el número de clases que necesita decorar). Luego tengo un código de inicialización que crea una fábrica de sesiones por base de datos, y para cada uno, usa la reflexión para encontrar todas las clases de ClassMap, examina el atributo para determinar a qué DB pertenece, y registra cada ClassMap en consecuencia.

Un ejemplo de archivo de mapeo:

[FluentNHibernateDatabase("MySecurityDatabase")] public class SystemUserMap : ClassMap<SystemUser> { public SystemUserMap() { Id(x => x.SystemUserId); Map(x => x.LoginId); Map(x => x.LoginPassword); Map(x => x.UserFirstName); Map(x => x.UserSurname); References(x => x.UserOrganisation, "OrganisationId"); } }

Obviamente, he definido una lista de los DB que se referencian / utilizan.
Mi implementación funciona hasta donde yo la tome, pero me he topado con un problema (que espero que alguien pueda ayudar):

He hecho mi pregunta aquí: cómo identificar la fábrica de sesiones de una entidad en particular con fluidez NHibernate y múltiples bases de datos