</head>
Archive for August, 2008
Resolviendo el error “Invalid Label” tras la llamada de eval(JSON)
Aug 28th
Hoy después de renegar un buen rato integrando jQuery, JSON.Net y ASP.NET me encontré que el string JSON no lo podía evaluar del lado del cliente. FireFox me tiraba un error “Invalid Label” luego de renegar mucho encontré esta solución en willCode4Beer.com (http://willcode4beer.com/tips.jsp?set=jsonInvalidLabel)
Sólo basta con encerrar el string con el JSON entre paréntesis de la siguiente forma:
var someJsonString = getDataFromServer(); var myObj = eval( "(" + someJsonString + ")" );
en lugar de:
var someJsonString = getDataFromServer(); var myObj = eval(someJsonString);
Saludos, y happy coding!
Insertar valores en una Identity PK
Aug 26th
Ya que estamos con el tema de las identities PK, aprovecho para hacer este post de ayuda memoria.
Para insertar valores en columnas Identity hay que hacer:
SET IDENTITY_INSERT ON [myTable] ON
y luego de hacer los inserts correspondientes apagar esto con
SET IDENTITY_INSERT ON [myTable] OFF
And happy coding!
Saludos!
Reiniciar los valores de una Identity PK
Aug 26th
Hoy me ecuentro haciendo una migración de un sistema, para que cumpla con los estándares PCI DSS.
Al realizar una herramienta de migración, me contré con que necesitaba reiniciar la columna Identity de la tabla en SQL, tras varios intentos.
Luego de leer Can I start IDENTITY values at a new seed?, la forma de lograr esto es:
DBCC CHECKIDENT('myTable', RESEED, 0)
And happy migration!
Saludos!
Cómo crear claves únicas en NHibernate
Aug 21st
Esta vez aprovecho para contar como crear claves de varías columnas en NHibernate.
Hace ya un tiempo que estoy leyendo y practicando con este ORM, ya que es el ORM recomendado por el movimiento ALT.NET, y realmente es genial para desarrollos Domain Driven Development.
Lo que estoy haciendo es generando el schema de la DB a partir de la clase SchemaExport de NHibernate. Mediante esta clase genero los scripts DDL necesarios para crear el schema de la DB partiendo de los archivos .hbm de mapeo.
Realmente estoy más que conforme con esta herramienta por lo flexible y orientada a aplicaciones de mediana a grande complejidad.
Bueno vamos al motivo del post
En este caso tengo una tabla de aplicaciones y otra de usuarios. Un usuario pertenece a una aplicacion y su username no se puede repetir. Esto nos lleva a tener que crear en la tabla usuarios una unique constraint que tenga como columnas a ApplicationId y a Username. Esto lo podemos hace en el archivo de mapeo de NHibernate usando el elemento <column ../> hijo del elemento <property …/> y definiendo el atributo unique-key.
El archivo de mapeo quedaría como sigue:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="WPoch.Common.Providers.Membership"
namespace="WPoch.Common.Providers.Membership.Domain">
<class name="User" table="`User`">
<id name="Id">
<generator class="guid" />
</id>
<property name="Username">
<column name="Username" unique-key="uq_User_Username"/>
</property>
<property name="Password"/>
<property name="Comment"/>
<property name="CreatedOn"/>
<property name="Email"/>
<property name="FailedPasswordAttempsCount"/>
<property name="FailedPasswordAttempsWindowStart"/>
<property name="IsAnonymous"/>
<property name="IsApproved"/>
<property name="IsLockedOut"/>
<property name="LockedOutOn"/>
<property name="LoggedOn"/>
<property name="PasswordChangedOn"/>
<many-to-one name="Application" cascade="all" not-null="true">
<column name="ApplicationId" unique-key="uq_User_Username" />
</many-to-one>
<set name="Roles" lazy="true" cascade="all" table="UserRole">
<key column="UserId" foreign-key="fk_UserRole_User" />
<many-to-many class="Role" not-found="exception" column="RoleId"/>
</set>
<bag name="ProfileProperties" lazy="true" table="UserProfile">
<key foreign-key="fk_UserProfile_User">
<column name="UserId" unique-key="uq_UserProfile_Name"/>
</key>
<composite-element class="ProfileProperty">
<parent name="User"/>
<property name="Name" not-null="true">
<column name="Name" unique-key="uq_UserProfile_Name"/>
</property>
<property name="ValueType" not-null="true" type="Type"/>
<property name="ValueSerialized" type="StringClob"/>
<property name="UpdatedOn" />
</composite-element>
</bag>
</class>
</hibernate-mapping>
Como verán estoy desarrollando Membership, Role y Profile Providers de ASP.Net usando NHibernate de fondo, ya que lo que viene por defecto no es de mi agrado y acopla bien con los sistemas que estoy desarrollando.
Cuando tenga algo más avanzado, lo publicaré en la web.
Saludos,