2011-04-11 4 views
1

Я совершенно новичок в nhibernate, я делал все правильно, пока не столкнулся с этой проблемой. Это похоже на ошибку NHibernate, но, будучи новичком с ней, она может, конечно, моя винаПроблема с отображением NHibernate, когда Id находится в абстрактном базовом классе

Имея это базовый класс, чтобы сделать все Id и равенство вещи

public abstract class ObjetoConId 
{ 
    public ObjetoConId() 
    { 
     Id=NewId(); 
    } 

    public virtual Guid Id {get;private set;} 

    public override bool Equals(object o) 
    { 
     if (Object.ReferenceEquals(this,o)) 
      return true; 

     if (o==null) return false; 

     ObjetoConId oId; 

     oId= o as ObjetoConId; 
     if (!Object.ReferenceEquals(oId,null)) 
      return (Id.Equals(oId.Id)); 

     return (base.Equals(o)); 
    } 
    public override int GetHashCode() 
    { 
     byte[] bId; 

     bId=Id.ToByteArray(); 

     return ((Int32)(bId[8]^bId[12])<<24) + 
       ((Int32)(bId[9]^bId[13])<<16) + 
       ((Int32)(bId[10]^bId[14])<<8) + 
       ((Int32)(bId[11]^bId[15])); 
    } 

    public virtual bool Equals(ObjetoConId o) 
    { 
     if (Object.ReferenceEquals(this,o)) 
      return true; 

     if (Object.ReferenceEquals(o,null)) return false; 
      return (Id.Equals(o.Id)); 
    } 

    public virtual string toString() 
    { 
     return this.GetType().FullName 
     + "[id=" + Id + "]"; 
    } 

    protected virtual Guid NewId() 
    { 
     return GuidComb.NewGuid(); 
    } 

    public static bool operator == (ObjetoConId x,ObjetoConId y) 
    { 
     if(Object.ReferenceEquals(x,y)) 
      return true; 
     if(Object.ReferenceEquals(x,null)) 
      return false; 
     return x.Equals(y); 
    } 

    public static bool operator != (ObjetoConId x,ObjetoConId y) 
    { 
     return !(x==y); 
    } 

    /// <summary> 
    /// Metodo interno para permitir el testing 
    /// </summary> 
    /// <param name="id"></param> 
    internal void setId(Guid id) 
    { 
     Id=id; 
    } 
} 

и эта сущность

public class Propiedad : ObjetoConId,IPropiedad 
{ 
    [Obsolete("Persistance Constructor only")] 
    public Propiedad() 
    { 
    } 


    public Propiedad (IList<IDescripcionCalificada> descripciones) 
    { 
     Descripciones=new Dictionary<string,IDescripcionCalificada>(descripciones.Count); 
     foreach(IDescripcionCalificada d in descripciones) 
      Descripciones.Add(d.Nombre,d); 
    } 


    #region IPropiedad implementation 
    public virtual IDictionary<string, IDescripcionCalificada> Descripciones {get;private set;} 

    #endregion 

} 

и это отображение

public class MapeoPropiedad : ClassMap<Propiedad> 
{ 
    public MapeoPropiedad() 
    { 
     Id(x => x.Id).Column("pro_id").GeneratedBy.Assigned(); 
     HasMany<DescripcionCalificada>(x => x.Descripciones) 
     .Cascade.SaveUpdate() 
     .AsMap<string>(index => index.Nombre) 
     ; 
    } 
} 

Тест на ней

[TestFixture] 
public class TestPropiedadPersistencia 
{ 

    [TestFixtureSetUp] 
    public void TestFixtureSetUp() 
    { 

     string connectionString="Server=127.0.0.1;Database=Ana;User ID=dev-test;Password=dev-test;"; 

     fcfg=Fluently.Configure() 
      .Database(PostgreSQLConfiguration.PostgreSQL82.ConnectionString(connectionString)) 
      .Mappings(m => m.FluentMappings.AddFromAssemblyOf<MapeoPropiedad>()); 


     fcfg.ExposeConfiguration(cfg => new SchemaExport(cfg).Create(false, true)); 
     sessions=fcfg.BuildSessionFactory(); 
    } 


    ISessionFactory sessions; 
    FluentConfiguration fcfg; 



    [TestFixtureTearDown] 
    public void TestFixtureTearDown() 
    { 
     fcfg.ExposeConfiguration(cfg => new SchemaExport(cfg).Drop(false, true)); 
     sessions.Close(); 
     sessions = null; 
     fcfg = null; 
    } 


    [Test] 
    public void CanCorrectlyMapPropiedad() 
    { 
     DescripcionCalificada descri1=new DescripcionCalificada("descri",new Descripcion("Esta es la descri")); 
     DescripcionCalificada descri2=new DescripcionCalificada("descriLarga",new Descripcion("Esta es la descriLarga")); 
     Dictionary<string,IDescripcionCalificada> descris=new Dictionary<string, IDescripcionCalificada>(2); 

     descris.Add(descri1.Nombre,descri1); 
     descris.Add(descri2.Nombre,descri2); 

     new PersistenceSpecification<Propiedad>(sessions.OpenSession(),new CustomEqualityComparer()) 
      .CheckProperty(c => c.Descripciones,descris) 
      .VerifyTheMappings(); 
    } 

} 

Дело в том, что тест не пройден, если я не поставил Not.LazyLoad() в отображении Это дает ошибку отображения

Ana.Nucleo.Lenguaje.Test.TestDescripcionCalificadaPersistencia (TestFixtureSetUp): 
FluentNHibernate.Cfg.FluentConfigurationException : An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail. 


    ----> NHibernate.InvalidProxyTypeException : The following types may not be used as proxies: 
Ana.Catalogacion.Implementacion.Propiedad: method setId should be 'public/protected virtual' or 'protected internal virtual' 

без ленивая загрузка, и если я поместил свойство Id в класс Propiedad и не наследовал от ObjetoConID, он также пройдет с и без Not.LazyLoad().

Любой может подтвердить это ошибка NH, или любая помощь будет оценена

EDIT:

Я нашел проблему, моя вина. Я пропустил SETID внутренней функции не защищен виртуальным и спутать с сеттер свойства Id, и, таким образом, missunderstood в execption

Фер

ответ

1

Я нашел проблему, моя вина. Я пропустил внутреннюю функцию setId, не будучи виртуально защищенной и запутанной с установщиком свойства Id, и, таким образом, пропустил исключение.

 Смежные вопросы

  • Нет связанных вопросов^_^