c# - NHibernate MySQL 复合键

标签 c# .net mysql nhibernate composite-key

我正在尝试创建一个复合键来模仿内置 MySQL.DB 表中的主键集。

Db主键如下:

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

这是我的DataBasePrivilege.hbm.xml 文件

<?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

编辑:现在我遇到了这个异常。有人可以帮忙吗?

最佳答案

好的,终于成功了。

第一次它不起作用,因为我在 TestMethod 中创建了一个 Object[](与 NHibernate 无关)

第二个异常不起作用,因为我必须将所有字段的所有数据类型更改为 String 而不是 bool。

关于c# - NHibernate MySQL 复合键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2677347/

相关文章:

c# - C# 中对属性的读写是原子的吗?

c# - Azure 持续部署 - Code First 迁移播种问题 (MVC 5)

c# - 连接到 Oracle 服务器时找不到文件 'C:\SomePath\Oracle.DataAccess.Common.Configuration.Section.xsd'

c# - 如何为每个用户打开单独的窗口

php - 如何以简单的形式禁用 SQL 注入(inject)的可能性?

sql - 如何在 SqLite 的一个查询中更新和选择一行?

c# - 如何构造Dictionary <string,List <string >>的实例

c# - visual studio 2017 启动有/无调试性能差异

c# - 相关 ICollection 实体不能为空

php - 如何使用PHP将Excel文件中的数据插入到Mysql表中?