Hola a todos, estoy intentando mapear una entidad sencilla y agregarle el
control de concurrencia a través de un campo DateTime, la clase tiene esta
estructura:

// AbstractEntity.cs
namespace ModelNH
{
public class AbstractEntity<TId>
{
public virtual TId Id { get; protected set; }
 public override bool Equals(object obj)
{
return Equals(obj as AbstractEntity<TId>);
}

private static bool IsTransient(AbstractEntity<TId> obj)
{
return obj != null && Equals(obj.Id, default(TId));
}

private Type GetUnproxiedType()
{
return GetType();
}
 public virtual bool Equals(AbstractEntity<TId> other)
{
if (other == null)
return false;
 if (ReferenceEquals(this, other))
return true;
 if (!IsTransient(this) && !IsTransient(other) && Equals(Id, other.Id))
{
var otherType = other.GetUnproxiedType();
var thisType = GetUnproxiedType();
return thisType.IsAssignableFrom(otherType) ||
otherType.IsAssignableFrom(thisType);
}
 return false;
}
 public override int GetHashCode()
{
if (Equals(Id, default(TId)))
return base.GetHashCode();
 return Id.GetHashCode();
}
}
}


// Entity.cs
namespace ModelNH
{
public class Entity: AbstractEntity<int>
{
public Entity(){}
}
}

// TestEntity.cs
namespace ModelNH
{
public class TestEntity: Entity
{
public virtual String Name { get; set; }
public virtual DateTime LastUpdated { get; set; }
}
}

y el archivo de mapeo:
<!-- mappings/TestEntity.hbm.xml -->
<?xml version="1.0"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="ModelNH"
namespace="ModelNH">
<class name="TestEntity" table="TEST">
<id name="Id" column="TEST_ID" type="int">
<generator class="sequence">
<param name="sequence">GEN_TEST_ID</param>
</generator>
</id>
<property name="Name" column="NAME" type="String" />
<version name="LastUpdated" column="LAST_UPDATED" type="timestamp" />
</class>
</hibernate-mapping>

Y el programa de consola:

//Program.cs

using System;
using NHibernate;
using NHibernate.Cfg;
using System.Data;
using ModelNH;
using System.IO;
using NHibernate.Linq;

namespace PruebaNHibernate
{
class Program
{
private static ISessionFactory factory;
private static ISession sess;
 public static void Main(string[] args)
{
try{
Configuration cfg = new Configuration().Configure();
cfg.AddDirectory(new DirectoryInfo(@".\mappings"));
 factory = cfg.BuildSessionFactory();
 using(sess = factory.OpenSession()){
var tests = sess.Query<TestEntity>();
tests.ForEach(t => Console.WriteLine(t.Name));
}
}catch(Exception e){
Console.WriteLine(e.Message);
}
 Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}

Estoy utilizando NHibernate 3.0.0.4000 y me conecto a una DB Firebird
(aunque no creo que ésto último influye en el error). Cuando ejecuto el
programa obtengo la excepción:

G:\Projects\ModelNH\PruebaNHibernate\bin\Debug\mappings\TestEntity.hbm.xml(10,4):
XML validation error: El elemento 'class' en espacio de nombres
'urn:nhibernate-mapping-2.2' tiene un elemento secundario 'version' en
espacio de nombres 'urn:nhibernate-mapping-2.2' no válido. Lista esperada de
elementos posibles: 'property, many-to-one, one-to-one, component,
dynamic-component, properties, any, map, set, list, bag, idbag, array,
primitive-array, join, subclass, joined-subclass, union-subclass, loader,
sql-insert, sql-update, sql-delete, filter, resultset, query, sql-query' en
espacio de nombres 'urn:nhibernate-mapping-2.2'.

Press any key to continue . . .

Saludos.

Bruno.

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