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