2012-12-03 27 views
0

我在使用NHibernate 3.3.2.4000的Oracle數據庫。爲什麼NHibernate按代碼映射忽略我的Oracle-cased表名:

我有一個單元測試設置來驗證可以從表中選擇一個實體集合。這裏是什麼樣子:

[TestFixture] 
public class UnitOfWorkIntegrationTests 
{ 
    private IUnitOfWork _unitOfWork; 
    private INHibernateSessionFactory _nHibernateSessionFactory; 
    private IActiveSessionManager _activeSessionManager; 

    [SetUp] 
    public void BeforeEachTest() 
    { 
     _nHibernateSessionFactory = new NHibernateSessionFactory(); 
     _activeSessionManager = new ActiveSessionManager(); 
     _unitOfWork = new UnitOfWork(_nHibernateSessionFactory, _activeSessionManager); 
    } 

    [Test] 
    public void ShouldFetchOAuthMemberships() 
    { 
     var oauths = _unitOfWork.OAuthMemberships.ToArray(); 
     oauths.ShouldNotBeNull(); 
    } 
} 

,其獲取我的OAuthMemberships集合拋出該異常的行:

無法執行查詢

[從bckgrd_booklet_app.OAuthMembership選擇oauthmembe0_.id爲id13_ oauthmembe0_]

[SQL:從bckgrd_booklet_app.OAuthMembership選擇oauthmembe0_.id作爲id13_ oauthmembe0_]

我的OAuthMembership類和映射如下。正如你所看到的,我將表名定義爲「OAUTH_MEMBERSHIP」,但生成的SQL包含的是駱駝類的類名。我沒有定義表名稱約定。爲什麼NHibernate會忽略我的Oracle-cased表名?

public class OAuthMembership 
{ 
    public virtual int Id { get; set; } 
    public virtual string Provider { get; set; } 
    public virtual string ProviderUserId { get; set; } 

    public virtual UserProfile UserProfile { get; set; } 
} 

public class OAuthMembershipMap : ClassMapping<OAuthMembership> 
{ 
    public void OAuthMembership() 
    { 
     Table("OAUTH_MEMBERSHIP"); 

     Id(x => x.Id, m => m.Column("ID")); 
     Property(x => x.Provider, m => m.Column("PROVIDER")); 
     Property(x => x.ProviderUserId, m => m.Column("PROVIDER_USER_ID")); 

     ManyToOne(x => x.UserProfile, m => m.Column("USER_PROFILE_ID")); 
    } 
} 

這裏是我的NHibernateSessionFactory:

public interface INHibernateSessionFactory 
{ 
    ISession Create(); 
} 

public class NHibernateSessionFactory : INHibernateSessionFactory 
{ 
    private static readonly ILog Log = LogManager.GetLogger(typeof(NHibernateSessionFactory).Name); 
    private readonly static ISessionFactory SessionFactory; 
    public static string ConnectionString 
    { 
     get 
     { 
      return ConfigurationManager.ConnectionStrings["MyConnection"].Return(x => x.ConnectionString, 
       "Data Source=myServer;User ID=bckgrd_booklet_app;Password=myPass;"); 
     } 
    } 

    static NHibernateSessionFactory() 
    { 
     try 
     { 
      var mapper = new ModelMapper(); 
      mapper.AddMappings(Assembly.GetExecutingAssembly().GetExportedTypes()); 

      HbmMapping domainMapping = mapper.CompileMappingForAllExplicitlyAddedEntities(); 

      var configure = new NHibernate.Cfg.Configuration().Configure(); 
      configure.AddMapping(domainMapping); 
      configure.BuildMappings(); 
      configure.DataBaseIntegration(x => 
      { 
       x.Driver<OracleClientDriver>(); 
       x.Dialect<Oracle10gDialect>(); 
       x.ConnectionStringName = ConnectionString; 
      }) 
      .CurrentSessionContext<WebSessionContext>(); 
      SessionFactory = configure.BuildSessionFactory(); 

     } 
     catch (Exception ex) 
     { 
      Log.Error("NHibernateSessionFactory did not initialize correctly.", ex); 
      throw; 
     } 
    } 

    public ISession Create() 
    { 
     Log.Debug("Creating new session."); 
     return SessionFactory.OpenSession(); 
    } 
} 

我ActiveSessionManager:

public interface IActiveSessionManager 
{ 
    void ClearActiveSession(); 
    NHibernate.ISession GetActiveSession(); 
    void SetActiveSession(NHibernate.ISession session); 
} 

public class ActiveSessionManager : IActiveSessionManager 
{ 
    [ThreadStatic] 
    private static ISession _current; 

    public ISession GetActiveSession() 
    { 
     return _current; 
    } 

    public void SetActiveSession(ISession session) 
    { 
     _current = session; 
    } 

    public void ClearActiveSession() 
    { 
     _current = null; 
    } 
} 

我的UnitOfWork定義的相關部分:

public interface IUnitOfWork 
{ 
    //... 
    IQueryable<OAuthMembership> OAuthMemberships { get; } 
    IQueryable<T> All<T>(); 
    //... 
} 

public class UnitOfWork : IUnitOfWork 
{ 
    private readonly ISession _session; 

    //... 

    public IQueryable<OAuthMembership> OAuthMemberships 
    { 
     get { return All<OAuthMembership>(); } 
    } 

    public UnitOfWork(
     INHibernateSessionFactory sessionFactory, 
     IActiveSessionManager activeSessionManager) 
    { 
     _session = sessionFactory.Create(); 
     activeSessionManager.SetActiveSession(_session); 
    } 

    public IQueryable<T> All<T>() 
    { 
     return _session.Query<T>(); 
    } 

    //... 
} 

回答

1

我在將Fluent NHibernate添加到我的項目並在那裏發生同樣的錯誤後發現我的錯誤。

我的OAuthMembershipMap沒有構造函數。我錯誤地添加了一個名爲OAuthMembership的無效方法,所以我的表映射和我的Id和Property映射失敗。請參閱更正後的代碼:

public class OAuthMembershipMap : ClassMapping<OAuthMembership> 
{ 
    public OAuthMembershipMap() 
    { 
     Table("OAUTH_MEMBERSHIP"); 

     Id(x => x.Id, m => m.Column("ID")); 
     Property(x => x.Provider, m => m.Column("PROVIDER")); 
     Property(x => x.ProviderUserId, m => m.Column("PROVIDER_USER_ID")); 

     ManyToOne(x => x.UserProfile, m => m.Column("USER_PROFILE_ID")); 
    } 
} 
相關問題