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.