Nelo, no lo puede hacer con una List... List admite duplicados.

--
Fabio Maulo


El 17/03/2011, a las 02:09, "[email protected]"
<[email protected]> escribió:

> en el código que mandé antes los field son IList, no IEnumerable,
> internamente tenés toda la funcionalidad de IList...
>
> class User {
> private IList<Role> _roles;
> public virtual IEnumerable<Role> Roles {
>   get { return _roles; }
> }
>
> public virtual AddRole(Role role)
> {
>   role.Users.Add(this);
>   _roles.Add(role);
> }
>
> public virtual RemoveRole(Role role)
> {
>   ....
> }
> }
>
> 2011/3/17 jazavala <[email protected]>:
>> Pero si ambos son IEnumerable
>>
>> class User{
>> public virtual IEnumerable<Role>{get {return _roles;}}
>> }
>>
>> class Role{
>> public virtual IEnumerable<User>{get {return _users;}}
>>
>>
>> }
>>
>>
>> como implemento los metodos Add de cada uno si IEnumerable no tiene
>> add, o solamente debo poner el extremo user.roles como IEnumerable ya
>> que role.users si funciona el add
>>
>> On 16 mar, 18:12, Walter Poch <[email protected]> wrote:
>>> Tenes en el mapping:
>>>
>>> <bag name="Roles" table="UserByRole" *inverse="true"*>
>>>
>>> la que vale es rol.Users, ahi va NHibernate a persistir.
>>>
>>> Lo que se refieren a mantener la integridad en memoria es que debes agregar
>>> el Rol al usuario y el Usuario al rol a la vez. Debes mantener en las dos
>>> entidades la consistencia. En tu caso estas agregando el Rol al usuario,
>>> pero esa instancia de Rol no tiene el usuario agregado en su colección de
>>> Users (que es donde finalmente NHibernate busca).
>>>
>>> Te recomiendo hacer métodos que sean llamados y se encarguen de mantener la
>>> consistencia:
>>>
>>> class Rol {
>>> public void AddUser(User user){
>>> this.Users.Add(user);
>>> user.Roles.Add(this);
>>>
>>> }
>>> }
>>>
>>> class User{
>>> public void AddRol(Rol rol){
>>> this.Roles.Add(rol);
>>> rol.Users.Add(this);
>>>
>>> }
>>> }
>>>
>>> Algo así, también yo intento de no exponer la colection directamente... sino
>>> como un IEnumerable<> (hoy me lo enseñó Fabio)
>>>
>>> Saludos,
>>>
>>> El 16 de marzo de 2011 20:34, jazavala 
>>> <[email protected]>escribió:
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>> On 16 mar, 11:33, Fabio Maulo <[email protected]> wrote:
>>>>> ROTFL!!! como te quedan esas cosas..... eh?
>>>
>>>>> 2011/3/16 José F. Romaniello <[email protected]>
>>>
>>>>> a que se refiere Los objetos deben ser consistentes en memoria??
>>>
>>>> si estos son mis mapeos
>>>
>>>> <?xml version="1.0" encoding="utf-8"?>
>>>> <hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-
>>>> instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema";
>>>> namespace="QS.Entities" assembly="QS" xmlns="urn:nhibernate-
>>>> mapping-2.2">
>>>>  <class name="Role">
>>>>    <id name="RoleId" type="Int64">
>>>>      <generator class="native" />
>>>>    </id>
>>>>    <property name="RoleName" />
>>>>    <property name="RoleDescription" />
>>>>    <property name="RoleActive" />
>>>>    <bag name="Users" table="UserByRole">
>>>>      <key column="RoleId" />
>>>>      <many-to-many class="User" column="UserId" />
>>>>    </bag>
>>>>    <bag name="Permissions" table="PermissionByRole">
>>>>      <key column="RoleId" />
>>>>      <many-to-many class="Permission" column="PermissionId" />
>>>>    </bag>
>>>>  </class>
>>>> </hibernate-mapping>
>>>
>>>> <?xml version="1.0" encoding="utf-8"?>
>>>> <hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-
>>>> instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema";
>>>> namespace="QS.Entities" assembly="QS" xmlns="urn:nhibernate-
>>>> mapping-2.2">
>>>>  <class name="User">
>>>>    <id name="UserId" type="Int64">
>>>>      <generator class="native" />
>>>>    </id>
>>>>    <property name="UserKey" />
>>>>    <property name="UserName" />
>>>>    <property name="UserEmail" />
>>>>    <property name="UserPassword" />
>>>>    <bag name="Roles" table="UserByRole" inverse="true">
>>>>      <key column="UserId" />
>>>>      <many-to-many class="Role" column="RoleId" />
>>>>    </bag>
>>>>    <property name="UserStatus" column="UserStatusId" />
>>>>  </class>
>>>> </hibernate-mapping>
>>>
>>>> y este test
>>>
>>>>  public void AddUserToRole()
>>>>        {
>>>>            using (ISession session = SessionFactory.OpenSession())
>>>>            using (ITransaction tx = session.BeginTransaction())
>>>>            {
>>>>                const long userId = 1;
>>>>                const long roleId = 56;
>>>>                var user = session.Get<User>(userId);
>>>>                var role = session.Get<Role>(roleId);
>>>
>>>>                //role.Users.Add(user);
>>>>                user.Roles.Add(role);
>>>
>>>>                //session.SaveOrUpdate(role);
>>>>                session.SaveOrUpdate(user);
>>>
>>>>                tx.Commit();
>>>
>>>>                //role = session.Get<Role>(roleId);
>>>>                //Assert.AreEqual(1, role.Users.Count);
>>>
>>>>                //user = session.Get<User>(userId);
>>>>                //Assert.AreEqual(1, user.Roles.Count);
>>>>            }
>>>>        }
>>>
>>>> a que se debe que cuando agrego usuarios al rol si lo hace y cuando
>>>> agrego roles al usuario no hace el insert.
>>>
>>>>>> 2da regla elemental cuando trabajas con ORM;
>>>>>> "Los objetos deben ser consistentes en memoria". Arregla eso y vas a
>>>>>> ver como se soluciona.
>>>
>>>>>> El 16/03/11, jazavala <[email protected]> escribió:
>>>>>>> si tengo una relación many to many desde cualquier lado se puede
>>>>>>> insertar es decir
>>>
>>>>>>> Role.Users.Add(User) Este me funciona
>>>
>>>>>>> User.Roles.Add(Role) Este no me funciona anexo mapeos que me da
>>>>>>> conform
>>>
>>>>>>> <?xml version="1.0" encoding="utf-8"?>
>>>>>>> <hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-
>>>>>>> instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema";
>>>>>>> namespace="QS.Entities" assembly="QS" xmlns="urn:nhibernate-
>>>>>>> mapping-2.2">
>>>>>>>   <class name="User">
>>>>>>>     <id name="UserId" type="Int64">
>>>>>>>       <generator class="native" />
>>>>>>>     </id>
>>>>>>>     <property name="UserKey" />
>>>>>>>     <property name="UserName" />
>>>>>>>     <property name="UserEmail" />
>>>>>>>     <property name="UserPassword" />
>>>>>>>     <bag name="Roles" table="UserByRole" inverse="true">
>>>>>>>       <key column="UserId" />
>>>>>>>       <many-to-many class="Role" column="RoleId" />
>>>>>>>     </bag>
>>>>>>>     <property name="UserStatus" column="UserStatusId" />
>>>>>>>   </class>
>>>>>>> </hibernate-mapping>
>>>
>>>>>>> <?xml version="1.0" encoding="utf-8"?>
>>>>>>> <hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-
>>>>>>> instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema";
>>>>>>> namespace="QS.Entities" assembly="QS" xmlns="urn:nhibernate-
>>>>>>> mapping-2.2">
>>>>>>>   <class name="Role">
>>>>>>>     <id name="RoleId" type="Int64">
>>>>>>>       <generator class="native" />
>>>>>>>     </id>
>>>>>>>     <property name="RoleName" />
>>>>>>>     <property name="RoleDescription" />
>>>>>>>     <property name="RoleActive" />
>>>>>>>     <bag name="Users" table="UserByRole">
>>>>>>>       <key column="RoleId" />
>>>>>>>       <many-to-many class="User" column="UserId" />
>>>>>>>     </bag>
>>>>>>>     <bag name="Permissions" table="PermissionByRole">
>>>>>>>       <key column="RoleId" />
>>>>>>>       <many-to-many class="Permission" column="PermissionId" />
>>>>>>>     </bag>
>>>>>>>   </class>
>>>>>>> </hibernate-mapping>
>>>
>>>>>>> --
>>>>>>> Para escribir al Grupo, hágalo a esta dirección:
>>>>>>> [email protected]
>>>>>>> Para más, visite:http://groups.google.com/group/NHibernate-Hispano
>>>
>>>>>> --
>>>>>> Enviado desde mi dispositivo móvil
>>>
>>>>>> --
>>>>>> Para escribir al Grupo, hágalo a esta dirección:
>>>>>> [email protected]
>>>>>> Para más, visite:http://groups.google.com/group/NHibernate-Hispano
>>>
>>>>> --
>>>>> Fabio Maulo
>>>
>>>> --
>>>> Para escribir al Grupo, hágalo a esta dirección:
>>>> [email protected]
>>>> Para más, visite:http://groups.google.com/group/NHibernate-Hispano
>>>
>>> --
>>> Saludos,
>>>
>>> Walter G. Poch
>>> Sr. .Net Developer
>>> --------------------------------------------
>>> Cell: +54 (9 341) 3353273
>>> [email protected]
>>
>> --
>> Para escribir al Grupo, hágalo a esta dirección: 
>> [email protected]
>> Para más, visite: http://groups.google.com/group/NHibernate-Hispano
>
> --
> Para escribir al Grupo, hágalo a esta dirección: 
> [email protected]
> Para más, visite: http://groups.google.com/group/NHibernate-Hispano

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

Responder a