2010-04-20 2 views
0

내장 된 MySQL.DB 테이블의 PrimaryKeys 집합을 모방하는 복합 키를 생성하려고합니다. 다음과 같이NHibernate MySQL 합성 키

DB를 기본 키는 다음과 같습니다이 내 DataBasePrivilege.hbm.xml 파일입니다

Field | Type | Null | 
---------------------------------- 
Host | char(60) | No | 
Db  | char(64) | No | 
User | char(16) | No | 

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="TGS.MySQL.DataBaseObjects" namespace="TGS.MySQL.DataBaseObjects"> 
    <class name="TGS.MySQL.DataBaseObjects.DataBasePrivilege,TGS.MySQL.DataBaseObjects" table="db"> 
    <composite-id name="CompositeKey" class="TGS.MySQL.DataBaseObjects.DataBasePrivilegePrimaryKey, TGS.MySQL.DataBaseObjects"> 
     <key-property name="Host" column="Host" type="char" length="60" /> 
     <key-property name="DataBase" column="Db" type="char" length="64" /> 
     <key-property name="User" column="User" type="char" length="16" /> 
    </composite-id> 
    </class> 
</hibernate-mapping> 

내 복합 키에 대한 제 2 개 클래스를 다음과 같습니다

namespace TGS.MySQL.DataBaseObjects 
{ 
    public class DataBasePrivilege 
    { 
     public virtual DataBasePrivilegePrimaryKey CompositeKey { get; set; } 
    } 

    public class DataBasePrivilegePrimaryKey 
    { 
     public string Host { get; set; } 
     public string DataBase { get; set; } 
     public string User { get; set; } 
     public override bool Equals(object obj) 
     { 
      if (ReferenceEquals(null, obj)) return false; 
      if (ReferenceEquals(this, obj)) return true; 
      if (obj.GetType() != typeof (DataBasePrivilegePrimaryKey)) return false; 
      return Equals((DataBasePrivilegePrimaryKey) obj); 
     } 

     public bool Equals(DataBasePrivilegePrimaryKey other) 
     { 
      if (ReferenceEquals(null, other)) return false; 
      if (ReferenceEquals(this, other)) return true; 
      return Equals(other.Host, Host) && Equals(other.DataBase, DataBase) && Equals(other.User, User); 
     } 

     public override int GetHashCode() 
     { 
      unchecked 
      { 
       int result = (Host != null ? Host.GetHashCode() : 0); 
       result = (result*397)^(DataBase != null ? DataBase.GetHashCode() : 0); 
       result = (result*397)^(User != null ? User.GetHashCode() : 0); 
       return result; 
      } 
     } 
    } 
} 

그리고 다음은 예외입니다. 점점 :

NHibernate.Exceptions.GenericADOException: could not load an entity: [TGS.MySQL.DataBaseObjects.DataBasePrivilege#component[Host,DataBase,User]{'Host'='%', 'DataBase'='totalglobalsteel', 'User'='guy'}][SQL: SELECT databasepr0_.Host as Host0_0_, databasepr0_.Db as Db0_0_, databasepr0_.User as User0_0_ FROM db databasepr0_ WHERE databasepr0_.Host=? and databasepr0_.Db=? and databasepr0_.User=?] ---> System.InvalidCastException: Specified cast is not valid. 
    at NHibernate.Type.AbstractCharType.Set(IDbCommand cmd, Object value, Int32 index) 
    at NHibernate.Type.NullableType.NullSafeSet(IDbCommand cmd, Object value, Int32 index) 
    at NHibernate.Type.NullableType.NullSafeSet(IDbCommand st, Object value, Int32 index, ISessionImplementor session) 
    at NHibernate.Type.ComponentType.NullSafeSet(IDbCommand st, Object value, Int32 begin, ISessionImplementor session) 
    at NHibernate.Engine.QueryParameters.BindParameters(IDbCommand command, GetNamedParameterLocations getNamedParameterLocations, Int32 start, ISessionImplementor session) 
    at NHibernate.Loader.Loader.BindParameterValues(IDbCommand statement, QueryParameters queryParameters, Int32 startIndex, ISessionImplementor session) 
    at NHibernate.Loader.Loader.PrepareQueryCommand(QueryParameters queryParameters, Boolean scroll, ISessionImplementor session) 
    at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) 
    at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) 
    at NHibernate.Loader.Loader.LoadEntity(ISessionImplementor session, Object id, IType identifierType, Object optionalObject, String optionalEntityName, Object optionalIdentifier, IEntityPersister persister) 
    --- End of inner exception stack trace --- 
    at NHibernate.Loader.Loader.LoadEntity(ISessionImplementor session, Object id, IType identifierType, Object optionalObject, String optionalEntityName, Object optionalIdentifier, IEntityPersister persister) 
    at NHibernate.Loader.Entity.AbstractEntityLoader.Load(ISessionImplementor session, Object id, Object optionalObject, Object optionalId) 
    at NHibernate.Loader.Entity.AbstractEntityLoader.Load(Object id, Object optionalObject, ISessionImplementor session) 
    at NHibernate.Persister.Entity.AbstractEntityPersister.Load(Object id, Object optionalObject, LockMode lockMode, ISessionImplementor session) 
    at NHibernate.Event.Default.DefaultLoadEventListener.LoadFromDatasource(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options) 
    at NHibernate.Event.Default.DefaultLoadEventListener.DoLoad(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options) 
    at NHibernate.Event.Default.DefaultLoadEventListener.Load(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options) 
    at NHibernate.Event.Default.DefaultLoadEventListener.ProxyOrLoad(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options) 
    at NHibernate.Event.Default.DefaultLoadEventListener.OnLoad(LoadEvent event, LoadType loadType) 
    at NHibernate.Impl.SessionImpl.FireLoad(LoadEvent event, LoadType loadType) 
    at NHibernate.Impl.SessionImpl.Get(String entityName, Object id) 
    at NHibernate.Impl.SessionImpl.Get(Type entityClass, Object id) 
    at NHibernate.Impl.SessionImpl.Get[T](Object id) 
    at TGS.MySQL.DataBase.DataProvider.GetDatabasePrivilegeByHostDbUser(String host, String db, String user) in C:\Documents and Settings\Michal\My Documents\Visual Studio 2008\Projects\TGS\TGS.MySQL.DataBase\DataProvider.cs:line 21 
    at TGS.UserAccountControl.UserAccountManager.GetDatabasePrivilegeByHostDbUser(String host, String db, String user) in C:\Documents and Settings\Michal\My Documents\Visual Studio 2008\Projects\TGS\TGS.UserAccountControl\UserAccountManager.cs:line 10 
    at TGS.UserAccountControlTest.UserAccountManagerTest.CanGetDataBasePrivilegeByHostDbUser() in C:\Documents and Settings\Michal\My Documents\Visual Studio 2008\Projects\TGS\TGS.UserAccountControlTest\UserAccountManagerTest.cs:line 12 

편집 : 이제 예외가 발생합니다. 아무도 도와 줄 수 있습니까?

답변

2

마지막으로 확인되었습니다.

내 TestMethod 나는 모든의 모든 데이터 유형을 변경했기 때문에 두 번째 예외가 작동하지 않는

(NHibernate에 함께 할 수있는 아무것도)의 Object []를 작성했기 때문에 그것이 작동하지 않는

처음 필드를 bool 대신 String으로 변경하십시오.