Hola de nuevo,

Estoy trabajando sobre el mismo código de los últimos días. Tenga una
nueva duda, que surge a raíz de intentar salvar un nuevo objeto de una
colección de composite-element.

Es decir, tengo una clase MemberData, que tiene una colección de
objetos Postal (direcciones postales). Postal no lo considero como una
entidad, y lo he mapeado como un bag de composite-element. El problema
es que entonces, no sé cómo especificar que la clave primaria de esa
tabla tenga como generator class identity.

Mis clases son éstas:

    public class MemberData
    {
        private int idPersonales;
        private string name, surname, place, urlPhoto, urlPage;
        private DateTime date;
        private IList<Email> emails;
        private IList<Telephone> telephones;
        private IList<Postal> postals;
        private IList<Ident> idents;
}

    public class Postal: IEquatable<Postal>
    {
        private int idPostal, number;
        private string name, flat, postalcode, city, place, country;
        private string wayKind;
}


Y los mappings...

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" default-
lazy="false">
  <class name="dataAccess.csfiles.datospersonalesygrupo.MemberData,
dataAccess" table="datospersonales">
    <id name="IdPersonales" column="idpersonales" type="Int32">
      <generator class="identity" />
    </id>
    <property name="Name" column="name" type="String"/>
    <property name="Surname" column="surname" type="String"/>
    <property name="Place" column="place" type="String"/>
    <property name="UrlPhoto" column="urlphoto" type="String"/>
    <property name="UrlPage" column="urlpage" type="String"/>
    <property name="Date" column="date"/>
    <bag name="Postals" table="postal">
      <key column="idpersonales" />
      <composite-element
class="dataAccess.csfiles.datospersonalesygrupo.Postal, dataAccess">
        <property name="IdPostal" column="idpostal" type="Int32"/>
        <property name="Name" column="name" type="String"/>
        <property name="Number" column="number" type="Int32"/>
        <property name="Flat" column="flat" type="String"/>
        <property name="PostalCode" column="postalcode" type="String"/
>
        <property name="City" column="city" type="String"/>
        <property name="Place" column="place" type="String"/>
        <property name="Country" column="country" type="String"/>
        <property name="WayKind" column="waykind" type="String"/>
      </composite-element>
    </bag>

Al realizar el session.Save(MemberData member) me da el siguiente
error:

Cannot insert explicit value for identity column in table 'postal'
when IDENTITY_INSERT is set to OFF.


Stack Trace:

[SqlException (0x80131904): Cannot insert explicit value for identity
column in table 'postal' when IDENTITY_INSERT is set to OFF.]
   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(TdsParserStateObject
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.Impl.NonBatchingBatcher.AddToBatch(IExpectation
expectation) in c:\net\nhibernate-1.2.0.Beta1\nhibernate\src\NHibernate
\Impl\NonBatchingBatcher.cs:36
 
NHibernate.Persister.Collection.AbstractCollectionPersister.Recreate(IPersistentCollection
collection, Object id, ISessionImplementor session) in c:\net
\nhibernate-1.2.0.Beta1\nhibernate\src\NHibernate\Persister\Collection
\AbstractCollectionPersister.cs:832

[ADOException: could not insert collection:
[dataAccess.csfiles.datospersonalesygrupo.MemberData.Postals#1]]
   dataAccess.csfiles.DBManager.save(Object obj) in C:\Documents and
Settings\César Díaz García\Mis documentos\Visual Studio 2005\Projects
\dataAccess\dataAccess\csfiles\DBManager.cs:177
   Controlador.save(Object obj) in c:\Documents and Settings\César
Díaz García\Mis documentos\Visual Studio 2005\WebSites\proyecto
\App_Code\Controlador.cs:80
   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:61
   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.RaisePostBackEvent(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


La columna idpostal de la tabla postal tiene activada la
especificación de identidad. Sospecho que el error es que falta lo del
identity en el mapping, pero no estoy seguro.

Alguien sabe a qué se debe?

Saludos!


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