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(IDictionary
2つの設定)NHibernate.Connection.ConnectionProvider.Configure(IDictionary2 settings)
at NHibernate.Connection.ConnectionProviderFactory.NewConnectionProvider(IDictionary
2つの設定)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)
再度、感謝します、