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.


--~--~---------~--~----~------------~-------~--~----~
Para escribir al Grupo, hágalo a esta dirección: 
[email protected]
Para más, visite: http://groups-beta.google.com/group/NHibernate-Hispano
-~----------~----~----~----~------~----~------~--~---

Responder a