1

Oracle 11gに6つのテーブルを持つデータベース(変更できません)があります。すべてのテーブルにはID用のOID人工列があり、そのタイプはRAW(16)です。DBAは、IDが6つのテーブルすべてで一意になるため、整数ではなく生であると回答しました。これを保証する必要があります。

私はC#でUIを開発しており、データレイヤーにはNHibernateを使用しようとしています。この必需品に対応する方法でIDジェネレーターを実装するにはどうすればよいですか?

どうもありがとう、

ペドロ・デュッソ

私の地図は:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="MetaManager.Data.Job,MetaManager.Data" table="JOB" lazy="true">
    <id name="Oid" column="OID" type="Guid">
      <generator class="guid.comb" />
    </id>
    <property name="JobId" type="Decimal">
      <column name="JOB_ID" length="10" sql-type="number" not-null="true" />
    </property>
    <bag name="EtlProcesses" inverse="true" cascade="all-delete-orphan">
     <key column="JOB_ID"/>
      <one-to-many class="MetaManager.Data.EtlProcess,MetaManager.Data"/>
    </bag>
  </class>
</hibernate-mapping>

そして私のクラスコードは次のとおりです。

namespace MetaManager.Data
{
    public class Job
    {
        public virtual Guid Oid { get; set; }
        public virtual decimal JobId { get; set; }
        private IList<EtlProcess> _EtlProcesses;
        public virtual IList<EtlProcess> EtlProcesses
        {
            get
            {
                if (_EtlProcesses == null)
                    _EtlProcesses = new List<EtlProcess>();
                return _EtlProcesses;
            }
            set
            {
                _EtlProcesses = value;
            }
        }
    }
}

Jobオブジェクトを作成していて、データベースに保存しようとしています。試してみるキャッチ

Job job = new Job(1, "Test Job", DateTime.Now, DateTime.MaxValue, "A", "Dusso");

Guid retVal;
ITransaction transaction = null;
try
{
    transaction = Session.BeginTransaction();
    Session.SaveOrUpdate(job);

    if (transaction != null && transaction.IsActive)
       transaction.Commit(); //the exception is trow here!
    else
       Session.Flush();
       retVal = job.Oid;
}
catch(Exception ex)
{...}

完全な例外は次のとおりです。

{System.InvalidCastException:パラメーター値をGuidからByte[]に変換できませんでした。---> System.InvalidCastException:オブジェクトはIConvertibleを実装する必要があります。System.Convert.ChangeType(オブジェクト値、タイプconversionType、IFormatProviderプロバイダー)at System.Data.OracleClient.OracleParameter.CoerceValue(オブジェクト値、MetaType destinationType)---内部例外スタックトレースの終了---System.Data。 OracleClient.OracleParameter.CoerceValue(Object value、MetaType destinationType)at System.Data.OracleClient.OracleParameter.SetCoercedValueInternal(Object value、MetaType metaType)at System.Data.OracleClient.OracleParameterBinding.PrepareForBind(OracleConnection connection、Int32&offset)at System.Data .OracleClient.OracleCommand.Execute(OciStatementHandle statementHandle、CommandBehaviorの動作、ブール値のneedRowid、

そして、私はあなたの最初の疑わしいことを心から理解していません。データベースには、JOBテーブルとETL_PROCESSテーブルがあります。それらの関係は1:nのようであり、JOBは多くのetlプロセスを持つことができます。

PS:私はnhibernate構成を追加しています、多分それは助けになります。

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="dialect">NHibernate.Dialect.Oracle9Dialect</property>
      <property name="connection.driver_class">NHibernate.Driver.OracleClientDriver</property>
      <property name="connection.connection_string_name">MetaManager</property>
      <mapping assembly="MetaManager.Data"/>
    </session-factory>
  </hibernate-configuration>

ODPの使用中にエラーが発生しました:{NHibernate.HibernateException:NHibernate.Driver.OracleDataClientDriverからドライバーを作成できませんでした。---> System.Reflection.TargetInvocationException:呼び出しのターゲットによって例外がスローされました。---> NHibernate.HibernateException:アセンブリOracle.DataAccessのIDbCommandおよびIDbConnection実装が見つかりませんでした。アセンブリOracle.DataAccessがアプリケーションディレクトリまたはグローバルアセンブリキャッシュにあることを確認します。アセンブリがGACにある場合は、アプリケーション構成ファイルの要素を使用して、アセンブリのフルネームを指定します。NHibernate.Driver.ReflectionBasedDriver..ctor(String driverAssemblyName、String connectionTypeName、String commandTypeName)at NHibernate.Driver.OracleDataClientDriver ..2 settings) --- End of inner exception stack trace --- at NHibernate.Connection.ConnectionProvider.ConfigureDriver(IDictionary2つの設定)NHibernate.Connection.ConnectionProvider.Configure(IDictionary2 settings) at NHibernate.Connection.ConnectionProviderFactory.NewConnectionProvider(IDictionary2つの設定)NHibernate.Cfg.SettingsFactory.BuildSettings(IDictionary`2プロパティ)でNHibernate.Cfg.Configuration.BuildSettings()でNHibernate.Cfg.Configuration.BuildSessionFactory()でMetaManager.Data.SessionProvider.get_Session()でC: \ Users \ Pedro_Dusso \ document \ visual studio 2010 \ Projects \ MetaManager \ MetaManager.Data \ SessionProvider.cs:line 27 at MetaManager.Data.AttributeDataService.get_Session()in C:\ Users \ Pedro_Dusso \ document \ visual studio 2010 \ Projects \ MetaManager \ MetaManager.Data \ Services \ AttributeDataService.cs:C:\ Users \ Pedro_Dusso \ document \ visual studio 2010 \ Projects \ MetaManager \ MetaManager.Data \ ServicesのMetaManager.Data.AttributeDataService.Save(属性属性)の33行目CのDebug.Program.Main(String [] args)の\ AttributeDataService.cs:line 58:\ Users \ Pedro_Dusso \ document \ visual studio 2010 \ Projects \ MetaManager \ Debug \ Program.cs:line 24 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly、String [] args)at System.AppDomain.ExecuteAssembly(String assemblyFile、Evidence assemblySecurity 、String [] args)at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()at System.Threading.ThreadHelper.ThreadStart_Context(Object state)at System.Threading.ExecutionContext.Run(ExecutionContext executeContext、ContextCallback callback、Object state、Boolean ignoreSyncCtx )at System.Threading.ExecutionContext.Run(ExecutionContext executeContext、ContextCallback callback、Object state)at System.Threading.ThreadHelper.ThreadStart()}System.AppDomain.ExecuteAssembly(String assemblyFile、Evidence assemblySecurity、String [] args)at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()at System.Threading.ThreadHelper.ThreadStart_Context(Object state)atSystem。 System.Threading.ExecutionContext.Run(ExecutionContext executeContext、ContextCallback callback、Object state)at System.Threading.ThreadHelper.ThreadStart()}のThreading.ExecutionContext.Run(ExecutionContext executeContext、ContextCallback callback、Object state、Boolean ignoreSyncCtx)System.AppDomain.ExecuteAssembly(String assemblyFile、Evidence assemblySecurity、String [] args)at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()at System.Threading.ThreadHelper.ThreadStart_Context(Object state)atSystem。 System.Threading.ExecutionContext.Run(ExecutionContext executeContext、ContextCallback callback、Object state)at System.Threading.ThreadHelper.ThreadStart()}のThreading.ExecutionContext.Run(ExecutionContext executeContext、ContextCallback callback、Object state、Boolean ignoreSyncCtx)System.Threading.ExecutionContext.Run(ExecutionContextexecutionContext、ContextCallbackコールバック、オブジェクト状態)でSystem.Threading.ThreadHelper.ThreadStart()}でRun(ExecutionContext executeContext、ContextCallbackコールバック、オブジェクト状態、ブール値ignoreSyncCtx)System.Threading.ExecutionContext.Run(ExecutionContextexecutionContext、ContextCallbackコールバック、オブジェクト状態)でSystem.Threading.ThreadHelper.ThreadStart()}でRun(ExecutionContext executeContext、ContextCallbackコールバック、オブジェクト状態、ブール値ignoreSyncCtx)

再度、感謝します、

4

1 に答える 1

1

RAWはOracleのバイナリ型であり、一意の識別子(16バイト== 128ビット)に非常によくマッピングされます。

したがって、Idプロパティをとして定義し、ジェネレータとしてGuid使用します。guid.comb

于 2010-10-06T12:59:26.217 に答える