La columna idPersonales dentro de la clase EmailDA no está permitiendo
valores null. NH está haciendo un Update insertando null en
idPersonales.
Pobrá con cascade="all-delete-orphan" a ver q pasa.
Saludos
On 1/30/07, Chili <[EMAIL PROTECTED]> wrote:
>
> Bien, mis clases son éstas:
>
> public class DatosPersonalesDA
> {
> private int idPersonales;
> private string name, surname, place, urlPhoto, urlPage;
> private DateTime date;
> private IList<EmailDA> emails;
> private IList<TelephoneDA> telephones;
> private IList<PostalDA> postals;
> private IList<IdentsDA> idents;
>
> // Aquí irían todas las propiedades de cada atributo
> }
>
> public class EmailDA
> {
> private int idPersonales;
> private string email;
>
> // Propiedades
> }
>
>
> Ahora los mapping de cada clase:
>
> <?xml version="1.0" encoding="utf-8" ?>
> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" default-
> lazy="false">
> <class
> name="dataAccess.csfiles.datospersonalesygrupo.DatosPersonalesDA,
> dataAccess" table="datospersonales">
> <id name="IdPersonales" column="idpersonales">
> <generator class="assigned" />
> </id>
> <bag name="Emails" cascade="all">
> <key column="idpersonales"/>
> <one-to-many
> class="dataAccess.csfiles.datospersonalesygrupo.EmailDA, dataAccess"/>
> </bag>
> </class>
> </hibernate-mapping>
>
> Omito el mapeo del resto de atributos.
>
> <?xml version="1.0" encoding="utf-8" ?>
> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" default-
> lazy="false">
> <class name="dataAccess.csfiles.datospersonalesygrupo.EmailDA,
> dataAccess" table="email" dynamic-update="true">
> <composite-id>
> <key-property name="IdPersonales" column="idpersonales"/>
> <key-property name="Email" column="mail"/>
> </composite-id>
> </class>
> </hibernate-mapping>
>
>
> Ahora bien, el problema es que al borrar un email, y luego actualizar,
> me da error. Actualizo un member, que se relaciona con las clases
> anteriores de la siguiente manera: un member tiene un curriculum, un
> curriculum tiene unos datos personales, y los datos personales
> contienen una colección de Emails.
>
> public class MemberDA
> {
> private string loginName, name, degree, category, laboralUnit,
> company;
> private CurriculumDA curriculum;
> private IList<DatosGrupoInvestigacionDA> gruposInvestigacion;
> private RolDA rol;
> }
>
> public class CurriculumDA
> {
> private int idCurriculum;
> private string version, format;
> private DateTime date;
> private DatosPersonalesDA datosPersonales;
> private IList<ItemsJobDescriptionDA> trabajos;
> }
>
>
> El fragmento de código donde salta la excepción es el siguiente:
>
> public void saveMember(MemberDA member) {
> if (!session.IsConnected)
> session.Reconnect();
> ITransaction transaction = null;
> try
> {
> transaction = session.BeginTransaction();
> session.Update(member);
> transaction.Commit();
> session.Disconnect();
> }
> catch (Exception e)
> {
> transaction.Rollback();
> session.Disconnect();
> throw e;
> }
> }
>
> Más concretamente, en el transaction.Commit();
>
> El mensaje de la excepción es:
>
> Cannot insert the value NULL into column 'idpersonales', table
> 'curriculum.dbo.email'; column does not allow nulls. UPDATE fails.
> The statement has been terminated.
>
> 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.
>
> 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) +177
> System.Data.SqlClient.SqlInternalConnection.OnError(SqlException
> exception, Boolean breakConnection) +68
>
> System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserState
> Object stateObj) +199
> System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,
> SqlCommand cmdHandler, SqlDataReader dataStream,
> BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject
> stateObj) +2300
> System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader
> ds, RunBehavior runBehavior, String resetOptionsString) +147
>
> System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior
> cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean
> async) +1021
> System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior
> cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String
> method, DbAsyncResult result) +314
>
> System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult
> result, String methodName, Boolean sendToPipe) +413
> System.Data.SqlClient.SqlCommand.ExecuteNonQuery() +115
> 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:51
> System.Web.UI.WebControls.Button.OnClick(EventArgs e) +75
> System.Web.UI.WebControls.Button.RaisePostBackEvent(String
> eventArgument) +97
>
> System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.Ra
> isePostBackEvent(String eventArgument) +7
> System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler
> sourceControl, String eventArgument) +11
> System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
> +33
> System.Web.UI.Page.ProcessRequestMain(Boolean
> includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
> +4880
>
> The statement has been terminated.
>
>
> >
>
--
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
-~----------~----~----~----~------~----~------~--~---