Bien, parece que tengo más problemas. Una vez asumido que tenía que
hacer un delete del email antes de hacer el SaveOrUpdate de la clase
padre, me encuentro con que no he avanzado nada y sigo donde estaba,
esto es, con el mismo error.
Hago el delete satisfactoriamente, me borra la fila de la tabla
correspondiente de la base de datos, pero en el momento que intento
actualizar el member (clase padre), el error que salta es el mismo.
Por si alguien no lo recordaba:
Cannot insert the value NULL into column 'idpersonales', table
'curriculum.dbo.email'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
Description: An unhandled exception occurred during the execution of
the current web request. Please review the stack trace for more
information about the error and where it originated in the code.
Exception Details: System.Data.SqlClient.SqlException: Cannot insert
the value NULL into column 'idpersonales', table
'curriculum.dbo.email'; column does not allow nulls. UPDATE fails.
The statement has been terminated.
Stack Trace:
[SqlException (0x80131904): Cannot insert the value NULL into column
'idpersonales', table 'curriculum.dbo.email'; column does not allow
nulls. UPDATE fails.
The statement has been terminated.]
System.Data.SqlClient.SqlConnection.OnError(SqlException exception,
Boolean breakConnection) +95
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException
exception, Boolean breakConnection) +82
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject
stateObj) +346
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,
SqlCommand cmdHandler, SqlDataReader dataStream,
BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject
stateObj) +3244
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader
ds, RunBehavior runBehavior, String resetOptionsString) +186
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean
async) +1121
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior
cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String
method, DbAsyncResult result) +334
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult
result, String methodName, Boolean sendToPipe) +407
System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +149
NHibernate.Impl.BatcherImpl.ExecuteNonQuery(IDbCommand cmd) in c:
\net\nhibernate-1.2.0.Beta1\nhibernate\src\NHibernate\Impl
\BatcherImpl.cs:172
NHibernate.Persister.Collection.AbstractCollectionPersister.DeleteRows(IPersistentCollection
collection, Object id, ISessionImplementor session) in c:\net
\nhibernate-1.2.0.Beta1\nhibernate\src\NHibernate\Persister\Collection
\AbstractCollectionPersister.cs:947
[ADOException: could not delete collection rows:
[dataAccess.csfiles.datospersonalesygrupo.DatosPersonalesDA.Emails#1]]
dataAccess.csfiles.DBManager.saveMember(MemberDA member) in C:
\Documents and Settings\César Díaz García\Mis documentos\Visual Studio
2005\Projects\dataAccess\dataAccess\DBManager.cs:97
Controlador.saveMember(MemberDA member) in c:\Documents and Settings
\César Díaz García\Mis documentos\Visual Studio 2005\WebSites\proyecto
\App_Code\Controlador.cs:58
web_privado_perfil_modificar.ButtonGuardar_Click(Object sender,
EventArgs e) in c:\Documents and Settings\César Díaz García\Mis
documentos\Visual Studio 2005\WebSites\proyecto\web\privado
\perfil_modificar.aspx.cs:50
System.Web.UI.WebControls.Button.OnClick(EventArgs e) +96
System.Web.UI.WebControls.Button.RaisePostBackEvent(String
eventArgument) +116
System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String
eventArgument) +31
System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler
sourceControl, String eventArgument) +32
System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
+72
System.Web.UI.Page.ProcessRequestMain(Boolean
includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
+3834
Alguna sugerencia más? Podría plantearme eliminar el composite-id de
esa tabla (ya que es el único que tengo en todo mi esquema de base de
datos), pero creo que estaría violando las normas morales que todo
programador deberíamos tener xDDDDD.
Si los de NHibernate pusieron composites, será que pueden utilizarse
sin que den tantos quebraderos de cabeza, no? O no? :SSSSSSSSSSS.
On 1 feb, 00:50, "Francisco A. Lozano" <[EMAIL PROTECTED]> wrote:
> Los composite-IDs en Java van perfeCTos... En .NET los pretendo usar
> en el próximo proyecto... a no ser que realmente den problemas...
> alguno tiene más info al respecto?
>
> El 31/01/07, Dario Quintana<[EMAIL PROTECTED]> escribió:
>
>
>
> > Uuuuuuuuh !! perdón ! No me dí cuenta que era composite !!! Sorry jeje.
>
> > Bueno amigo, creo q estás solo entonces.
> > Nunca trabajo por compuestas, por ese mismo motivo, y tampoco ví
> > alguien que lo haga, o sino es muy timido :)
>
> > En todo este tiempo de usar NHibernate arribé a que con:
>
> > -composite-id
> > -remoting
> > -webservices
>
> > ...no es soplar y hacer botellas, te va a doler un poco la cabeza con
> > estos (mi opinión y expiencia personal).
>
> > Conclusión:
>
> > Hacé lo que te decían: Vas a tener que borrar primero el Hijo (pero
> > borrarlo con Delete).
>
> > On 1/31/07, Chili <[EMAIL PROTECTED]> wrote:
>
> > > La tabla Email (hija) tiene una FK a la tabla DatosPersonales, pero no
> > > puede ser null, pues forma parte de la clave primaria de la propia
> > > tabla Email. Es decir, mi tabla Email es así:
>
> > > ---------------------------------------
> > > | Email |
> > > --------------------------------------
> > > | PK(email, idpersonales) |
> > > | FK(idpersonales) |
> > > ---------------------------------------
>
> > > idpersonales es clave primaria de la tabla DatosPersonales. Por tanto,
> > > no puede ser NULL. Esto quiere decir que tengo que hacer el delete
> > > individual del Email ya que la actualización de DatosPersonales
> > > necesita que las foreign keys puedan ser NULL para borrar los objetos
> > > perdidos?
>
> > > On 31 ene, 20:10, "Dario Quintana" <[EMAIL PROTECTED]>
> > > wrote:
> > > > Si, ningun problema:
>
> > > > public int Guardar(ActividadPlan entity)
> > > > {
> > > > if (IsValid(entity, Validate.Entity))
> > > > {
> > > > try
> > > > {
> > > > _ActividadPlanData.BeginTransaction();
> > > > _ActividadPlanData.SaveOrUpdateObject(entity);
> > > > _ActividadPlanData.CommitTransaction();
> > > > }
> > > > catch (Exception ex)
> > > > {
> > > > _ActividadPlanData.RollBackTransaction();
> > > > throw ex;
> > > > }
> > > > }
> > > > return entity.IdActividadPlan;
> > > > }
>
> > > > Tambien adjunto la capa de abajo: ActividadPlanData, y referencia de
> > > > más abajo: BaseRepository, para que veas todo el camino. Y no hay nada
> > > > de distinto en lo que vos queres hacer.
> > > > Te fijaste si la columna de la tabla hija (en la FK) acepta null ?
> > > > Controlá nuevamente los mapping, como yo lo hice, funcionó.
>
> > > > On 1/31/07, Chili <[EMAIL PROTECTED]> wrote:
>
> > > > > He estado mirando tu código, y básicamente es a lo que yo me refería.
> > > > > Borras un elemento de tu colección, y a continuación salvas tu clase
> > > > > padre (la actualizas) y el nhibernate se ocupa de todo. He visto algo
> > > > > en un mapping que no sé para qué sirve, a ver si me lo podrías
> > > > > explicar: unsaved-value="0".
>
> > > > > Como no sé lo que estoy haciendo mal, ¿podrías pegar aquí tu método
> > > > > Guardar de ActividadPlanBL?
>
> > > > > Saludos!
>
> > > > > On 31 ene, 01:29, "Dario Quintana" <[EMAIL PROTECTED]>
> > > > > wrote:
> > > > > > Adjunto un pedazo de codigo, explico algo del codigo:
>
> > > > > > Son 2 entidades:
>
> > > > > > -ActividadPlan (padre)
> > > > > > -LaborActividadPlan (hija)
>
> > > > > > tambien mando un ejemplo de form con la funcionalidad, para que vean
> > > > > > algo del código:
>
> > > > > > - frmLaboresPorActividad.cs
>
> > > > > > Bien lo que hago es asignar a "bsource" (que es un bindingsource) la
> > > > > > lista de las LaborActividadPlan. Cuando quiero eliminar un hijo, me
> > > > > > "paro" sobre el hijo y hago:
> > > > > > bsource.RemoveCurrent();
>
> > > > > > y despues le doy Guardar:
>
> > > > > > this.ActividadPlanBL.Guardar(this.ActividadPlan);
>
> > > > > > Solamente guardo el padre, el hijo se borra solo, NHibernate se dá
> > > > > > cuenta solito y lo elimina.
>
> > > > > > Tambien adjunto los mapping para que vean.
>
> > > > > > Ahora despues la seguimos...ahora tengo que salir..nos vemos gente
>
> > > > > > On 1/30/07, Ezequiel Jadib <[EMAIL PROTECTED]> wrote:
>
> > > > > > > si al elemento que eliminas en la lista no le haces un delete no
> > > > > > > te va a
> > > > > > > funcionar
> > > > > > > ________________________________
>
> > > > > > > rdi2k | Ezequiel Jadib | MSN: [EMAIL PROTECTED] | Blogs:
> > > > > > >http://geeks.ms/blogs/ejadib/(ES) - ejadib.wordpress.com (EN)
>
> > > > > > > ----- Original Message -----
> > > > > > > From: Chili
> > > > > > > To: NHibernate-Hispano
> > > > > > > Sent: Tuesday, January 30, 2007 7:42 PM
> > > > > > > Subject: [NHibernate-Hispano] Re: Problemas con un update
>
> > > > > > > Lo que me dices es lo que intentaba hacer, es decir, elimino el
> > > > > > > elemento de la lista en memoria, luego hago el update de la
> > > > > > > persona, y
> > > > > > > ahí es donde me da error, por lo que ya no puedo seguir.
>
> > > > > > > On 30 ene, 22:45, "Andrés G. Aragoneses [ knocte ]" <[EMAIL
> > > > > > > PROTECTED]>
> > > > > > > wrote:
> > > > > > > > Chili escribió:
>
> > > > > > > > > Eso de hacer el delete de la propia entidad ya tiene más
> > > > > > > > > sentido :).
> > > > > > > > > No obstante, como yo también soy un principiante, me gustaría
> > > > > > > > > que
> > > > > > > > > alguien que estuviese más ducho me dijera si es necesario.
>
> > > > > > > > > En cuanto a lo del inverse=true, es necesario? Lo digo porque
> > > > > > > > > yo no
> > > > > > > > > necesito tener ninguna referencia desde EmailDA a
> > > > > > > > > DatosPersonalesDA, y
> > > > > > > > > según tengo entendido, inverse=true, es que puedes dar la
> > > > > > > > > vuelta, es
> > > > > > > > > decir:
>
> > > > > > > > > Persona 1 - n Direcciones
>
> > > > > > > > > Persona.Direcciones[0].Persona
>
> > > > > > > > Opino lo mismo que tú, que el inverse="true" sólo es necesario
> > > > > > > > especificarlo en los casos en los que tienes acceso desde los
> > > > > > > > dos
> > > > > > > > sentidos de la colección, y sólo en uno de los extremos.
>
> > > > > > > > Lo que yo haría es hacer dos cosas: eliminar el elemento de la
> > > > > > > > lista,
> > > > > > > > hacer SaveOrUpdate en Persona, y luego eliminar con Delete la
> > > > > > > > dirección
> > > > > > > > propiamente dicha, y luego Flush.
>
> > > > > > > > Andrés [ knocte ]
>
> > > > > > > > --
>
> > > > > > --
> > > > > > Dario Quintanahttp://blog.darioquintana.com.ar
>
> > > > > > codigo.zip
> > > > > > 8 KDescargar
>
> > > > --
> > > > Dario Quintanahttp://blog.darioquintana.com.ar
>
> > > > codigo2.ZIP
> > > > 5 KDescargar
>
> > --
> > Dario Quintana
> >http://blog.darioquintana.com.ar
--~--~---------~--~----~------------~-------~--~----~
Para escribir al Grupo, hágalo a esta dirección:
[email protected]
Para más, visite: http://groups-beta.google.com/group/NHibernate-Hispano
-~----------~----~----~----~------~----~------~--~---