No tendrias clave primaria... claro que si, la fila entera deberia ser
unica.
O sea, todos los campos deberían ser clave para no permitir duplicados, pero
esas son restricciones a nivel de bd, supongo que nhib puede manejar filas
duplicadas. Es interesante ver como resuelve este problema nhib: borra todos
y agrega todos denuevo.

-----Original Message-----
From: [email protected]
[mailto:[EMAIL PROTECTED] On Behalf Of Chili
Sent: Friday, February 09, 2007 16:22
To: NHibernate-Hispano
Subject: [NHibernate-Hispano] Re: Activar identity en un composite-element


Ok, como bien dices no tiene identificador (estaba mirando la doc de
nhibernate y me acabo de encontrar esto:

NHibernate has to use each columns value to identify a record when
deleting objects (there is no separate primary key column in the
composite element table), which is not possible with null values.)

Entonces, mi tabla postal qué utiliza como clave primaria? No tendría
clave primaria? Tendría que controlar desde el código con el Equals
que no se puedan insertar duplicados en la bd?

On 9 feb, 20:15, "Ezequiel Jadib" <[EMAIL PROTECTED]> wrote:
> Si no es una entidad no tiene un identificador... pasaria ser un value
object
>
>
----------------------------------------------------------------------------
----
>
> 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: Friday, February 09, 2007 4:09 PM
>   Subject: [NHibernate-Hispano] Activar identity en un composite-element
>
>   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(TdsParserStateObjec
t
>   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(IPersis
tentCollection
>   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.RaisePo
stBackEvent(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