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
