una obtener objetos mostrar lista eliminar elementos elemento colecciones campo agregar actualizar c# nhibernate insert nhibernate-mapping has-many

obtener - mostrar elementos de una lista c#



La inserción de NHibernate genera actualizaciones para los elementos de la colección (1)

Creo que deberás echarle un vistazo al atributo de mapeo ''Inverso''.

HasMany(x => x.ChildNodes) .Inverse() .KeyColumns.Add("Parent_id") .Cascade.All();

¿Cómo debo configurar mis asignaciones para evitar que NHibernate actualice las claves externas de mis entidades secundarias inmediatamente después de insertarlas?

Por ejemplo, la clase para padres se mapea así:

class ParentMap : ClassMap<Parent> { public ParentMap() { Id(x => x.Id) .GeneratedBy.Increment(); Map(x => x.Name); HasMany(x => x.ChildNodes) .KeyColumns.Add("Parent_id") .Cascade.All(); } }

Deje que Parent tenga un montón de objetos Child :

Parent p = new Parent("test"); p.ChildNodes.AddRange(GetSomeDummyNodes());

Cuando guardo la entidad padre, el SQL generado se ve así:

INSERT INTO [Parent] (Name, Id) VALUES (@p0, @p1); @p0 = ''test'', @p1 = 0 INSERT INTO [Child] (Name, Id) VALUES (@p0); @p0 = ''child1'', @p1 = 0 INSERT INTO [Child] (Name, Id) VALUES (@p0); @p0 = ''child2'', @p1 = 1 INSERT INTO [Child] (Name, Id) VALUES (@p0); @p0 = ''child3'', @p1 = 2 UPDATE [Child] SET Parent_id = @p0 WHERE Id = @p1; @p0 = 0, @p1 = 0 UPDATE [Child] SET Parent_id = @p0 WHERE Id = @p1; @p0 = 1, @p1 = 0 UPDATE [Child] SET Parent_id = @p0 WHERE Id = @p1; @p0 = 2, @p1 = 0

Si utilizo Guid.Comb como generador de columnas Id, no hay actualizaciones, las claves externas se configuran en las INSERT inmediatamente. Pero dado que estoy usando la estrategia Increment (que también crea ID en el lado del cliente, y no hay ninguna instrucción SELECT que lea el valor ID de la base de datos, no veo por qué los ID no se pudieron establecer inmediatamente.