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
-~----------~----~----~----~------~----~------~--~---