2011-04-11 74 views
1

我對nhibernate很新,我做得很好,直到我面臨這個問題,它看起來像一個NHibernate的bug,但作爲一個新手,它可以肯定是我的錯問題與NHibernate映射時,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,或任何幫助將不勝感激

編輯:

我發現這個問題,我的錯。我錯過了SETID內部函數不是虛保護和困惑與id屬性的制定者,從而missunderstood的execption

費爾

回答

1

我發現這個問題,我的錯。我錯過了沒有被虛擬保護並且與Id屬性的setter混淆的setId內部函數,並且因此錯過了對此的解釋