Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有自定义用户类型的NHibernate ID生成器_Nhibernate_Nhibernate Mapping - Fatal编程技术网

具有自定义用户类型的NHibernate ID生成器

具有自定义用户类型的NHibernate ID生成器,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我有一个使用遗留数据库(DB2)的NHibernate实现,我被要求修改该数据库,我遇到了一个问题,即让id生成器处理定义为客户用户类型的id属性 表中的数据映射到与以下类似的类: // CLASS FILE public class Request { public virtual int Id { get; set; } ... other data properties ... } //MAPPING FILE <?xml version="1.0" encodin

我有一个使用遗留数据库(DB2)的NHibernate实现,我被要求修改该数据库,我遇到了一个问题,即让id生成器处理定义为客户用户类型的id属性

表中的数据映射到与以下类似的类:

// CLASS FILE
public class Request {
    public virtual int Id { get; set; }
    ... other data properties ...
}

//MAPPING FILE
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="LibraryName" namespace="LibraryName.Domain" default-cascade="none">
    <class name="Request" schema="..." table="..." where="...">
        <id name="Id" column="..." type="LibraryName.Domain.DB2UserTypes.NullableIntegerType, LibraryName" />

        ... other data property mappings ...

我被要求修改映射,以便我们可以创建新的请求对象,并使用生成器生成ID。我创建了generator类并修改了请求对象映射,以将generator用于Id

// GENERATOR CLASS
public class RequestGenerator : TableGenerator
{
    public override object Generate(NHibernate.Engine.ISessionImplementor session, object obj)
    {
        using (IDbCommand command = session.Connection.CreateCommand())
        {
            command.CommandText = @"...";
            command.CommandType = CommandType.StoredProcedure;

            var parameter = command.CreateParameter();
            parameter.DbType = DbType.Int32;
            parameter.ParameterName = "@generatedId";
            parameter.Value = 0;
            parameter.Direction = ParameterDirection.InputOutput;
            command.Parameters.Add(parameter);

            command.ExecuteNonQuery();

            return Convert.ToInt32(parameter.Value);
        }
    }
}

//MODIFIED MAPPING FILE
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="LibraryName" namespace="LibraryName.Domain" default-cascade="none">
    <class name="Request" schema="..." table="..." where="...">
        <id name="Id" column="..." type="LibraryName.Domain.DB2UserTypes.NullableIntegerType, LibraryName" >
            <generator class="LibraryName.Domain.DB2Generators.RequestGenerator, LibraryName" />
        </id>

        ... other data property mappings ...
//生成器类
公共类RequestGenerator:TableGenerator
{
公共重写对象生成(NHibernate.Engine.ISessionImplementor会话,对象obj)
{
使用(IDbCommand=session.Connection.CreateCommand())
{
command.CommandText=@“…”;
command.CommandType=CommandType.storedProcess;
var参数=command.CreateParameter();
parameter.DbType=DbType.Int32;
parameter.ParameterName=“@generatedId”;
参数值=0;
parameter.Direction=ParameterDirection.InputOutput;
command.Parameters.Add(参数);
command.ExecuteNonQuery();
返回Convert.ToInt32(参数值);
}
}
}
//修改的映射文件
... 其他数据属性映射。。。

当我尝试测试修改后的映射时,在我的代码运行之前,我得到一个错误,NHibernate无法实例化ID生成器

// Sample Code
Request request = new Request() { Id = 0, ... other properties }
session.Save(request);
session.Flush();

// Exception Details and Stack Trace
NHibernate.MappingException was unhandled by user code
Message=could not instantiate id generator: LibraryName.Domain.DB2Generators.RequestGenerator, LibraryName
Source=NHibernate
StackTrace:
    at NHibernate.Id.IdentifierGeneratorFactory.Create(String strategy, IType type, IDictionary`2 parms, Dialect dialect)
    at NHibernate.Mapping.SimpleValue.CreateIdentifierGenerator(Dialect dialect, String defaultCatalog, String defaultSchema, RootClass rootClass)
    at NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners)
    at NHibernate.Cfg.Configuration.BuildSessionFactory()
    at LibraryName.Infrastructure.NH.NHibernateSessionFactory.createSessionFactory() in C:\...\NHibernate\NHibernateSessionFactory.cs:line 23
    at LibraryName.Infrastructure.NH.NHibernateSessionFactory.get_SessionFactory() in C:\...\NHibernate\NHibernateSessionFactory.cs:line 15
    at LibraryName.Infrastructure.NH.NHibernateSessionFactoryProvider.CreateInstance(IContext context) in C:\...\NHibernate\NHibernateSessionFactoryProvider.cs:line 13
    at Ninject.Activation.Provider`1.Create(IContext context)
    at Ninject.Activation.Context.Resolve()
    at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding)
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
    at System.Linq.Enumerable.<CastIterator>d__b1`1.MoveNext()
    at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
    at Ninject.ResolutionExtensions.Get[T](IResolutionRoot root, IParameter[] parameters)
    at LibraryName.Infrastructure.InternalMvcModule.<Load>b__0(IContext c) in C:\...\Ninject\InternalMvcModule.cs:line 16
    at Ninject.Activation.Providers.CallbackProvider`1.CreateInstance(IContext context)
    at Ninject.Activation.Provider`1.Create(IContext context)
    at Ninject.Activation.Context.Resolve()
    at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding)
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
    at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
    at Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent)
    at Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent)
    at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target)
    at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.<Create>b__2(ITarget target)
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
    at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
    at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
    at Ninject.Activation.Providers.StandardProvider.Create(IContext context)
    at Ninject.Activation.Context.Resolve()
    at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding)
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
    at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
    at Ninject.Web.Mvc.NinjectDependencyResolver.GetService(Type serviceType)
    at System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType)


    InnerException: System.ArgumentException
    Message=type is not a ValueTypeType
    Parameter name: type
    Source=NHibernate
    ParamName=type
    StackTrace:
        at NHibernate.Id.TableGenerator.Configure(IType type, IDictionary`2 parms, Dialect dialect)
        at NHibernate.Id.IdentifierGeneratorFactory.Create(String strategy, IType type, IDictionary`2 parms, Dialect dialect)
        InnerException: 
//示例代码
请求=新请求(){Id=0,…其他属性}
会话。保存(请求);
session.Flush();
//异常详细信息和堆栈跟踪
用户代码未处理NHibernate.MappingException
Message=无法实例化id生成器:LibraryName.Domain.DB2Generators.RequestGenerators,LibraryName
来源=NHibernate
堆栈跟踪:
在NHibernate.Id.IdentifierGeneratorFactory.Create(字符串策略,IType类型,IDictionary`2参数,方言)
位于NHibernate.Mapping.SimpleValue.CreateIdentifierGenerator(方言方言、字符串defaultCatalog、字符串defaultSchema、根类RootClass)
在NHibernate.Impl.SessionFactoryImpl..ctor(配置cfg、映像映射、设置、事件侦听器)
在NHibernate.Cfg.Configuration.BuildSessionFactory()中
在C:\…\NHibernate\NHibernateSessionFactory.cs中的LibraryName.Infrastructure.NH.NHibernateSessionFactory.createSessionFactory()处:第23行
在LibraryName.Infrastructure.NH.NHibernateSessionFactory.get\u SessionFactory()中的C:\…\NHibernate\NHibernateSessionFactory.cs:第15行
在C:\…\NHibernate\NHibernateSessionFactoryProvider.cs中的LibraryName.Infrastructure.NH.NHibernateSessionFactoryProvider.CreateInstance(IContext上下文)处:第13行
位于Ninject.Activation.Provider`1.Create(IContext上下文)
在Ninject.Activation.Context.Resolve()处
在Ninject.KernelBase.c___显示class10.b____c(IBinding binding)
在System.Linq.Enumerable.WhereSelectEnumerableInterator`2.MoveNext()中
在System.Linq.Enumerable.d_uB1`1.MoveNext()中
at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
在Ninject.ResolutionExtensions.Get[T](IResolutionRoot根,iPParameter[]参数)
在c:\…\Ninject\InternalMvcModule.cs中的LibraryName.Infrastructure.InternalMvcModule.b_u0(IContext c)中:第16行
位于Ninject.Activation.Providers.CallbackProvider`1.CreateInstance(IContext上下文)
位于Ninject.Activation.Provider`1.Create(IContext上下文)
在Ninject.Activation.Context.Resolve()处
在Ninject.KernelBase.c___显示class10.b____c(IBinding binding)
在System.Linq.Enumerable.WhereSelectEnumerableInterator`2.MoveNext()中
在System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)处
在Ninject.Planning.Targets.Target`1.GetValue(输入服务,IContext父项)
在Ninject.Planning.Targets.Target`1.ResolveWithin(IContext父级)
位于Ninject.Activation.Providers.StandardProvider.GetValue(IContext上下文,ITarget目标)
在Ninject.Activation.Providers.StandardProvider.c__DisplayClass4.b__2(ITarget目标)
在System.Linq.Enumerable.WhereSelectArrayInterator`2.MoveNext()中
在System.Linq.Buffer`1..ctor处(IEnumerable`1源)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1源)
位于Ninject.Activation.Providers.StandardProvider.Create(IContext上下文)
在Ninject.Activation.Context.Resolve()处
在Ninject.KernelBase.c___显示class10.b____c(IBinding binding)
在System.Linq.Enumerable.WhereSelectEnumerableInterator`2.MoveNext()中
在System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)处
位于Ninject.Web.Mvc.NinjectDependencyResolver.GetService(类型serviceType)
位于System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext RequestContext,类型controllerType)
InnerException:System.ArgumentException
消息=类型不是ValueTypeType
参数名称:类型
来源=NHibernate
ParamName=type
堆栈跟踪:
在NHibernate.Id.TableGenerator.Configure(IType类型,IDictionary`2个参数,方言)
在NHibernate.Id.IdentifierGeneratorFactory.Create(字符串策略,IType类型,IDictionary`2参数,方言)
内部异常:
如果从id映射中删除自定义类型(type=“LibraryName.Domain.DB2UserTypes.NullableIntegerType,LibraryName”),则生成器工作正常,对象保存到数据库。如何使生成器和Id上的用户定义类型一起工作?

显示其
Configure
方法希望列类型是
PrimitiveType
的子类。在您的例子中,情况似乎并非如此,因为您只是实现了
IEnhancedUserType
(这可能是内部包装的,但不是由
基本类型包装的)<
// Sample Code
Request request = new Request() { Id = 0, ... other properties }
session.Save(request);
session.Flush();

// Exception Details and Stack Trace
NHibernate.MappingException was unhandled by user code
Message=could not instantiate id generator: LibraryName.Domain.DB2Generators.RequestGenerator, LibraryName
Source=NHibernate
StackTrace:
    at NHibernate.Id.IdentifierGeneratorFactory.Create(String strategy, IType type, IDictionary`2 parms, Dialect dialect)
    at NHibernate.Mapping.SimpleValue.CreateIdentifierGenerator(Dialect dialect, String defaultCatalog, String defaultSchema, RootClass rootClass)
    at NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners)
    at NHibernate.Cfg.Configuration.BuildSessionFactory()
    at LibraryName.Infrastructure.NH.NHibernateSessionFactory.createSessionFactory() in C:\...\NHibernate\NHibernateSessionFactory.cs:line 23
    at LibraryName.Infrastructure.NH.NHibernateSessionFactory.get_SessionFactory() in C:\...\NHibernate\NHibernateSessionFactory.cs:line 15
    at LibraryName.Infrastructure.NH.NHibernateSessionFactoryProvider.CreateInstance(IContext context) in C:\...\NHibernate\NHibernateSessionFactoryProvider.cs:line 13
    at Ninject.Activation.Provider`1.Create(IContext context)
    at Ninject.Activation.Context.Resolve()
    at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding)
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
    at System.Linq.Enumerable.<CastIterator>d__b1`1.MoveNext()
    at System.Linq.Enumerable.Single[TSource](IEnumerable`1 source)
    at Ninject.ResolutionExtensions.Get[T](IResolutionRoot root, IParameter[] parameters)
    at LibraryName.Infrastructure.InternalMvcModule.<Load>b__0(IContext c) in C:\...\Ninject\InternalMvcModule.cs:line 16
    at Ninject.Activation.Providers.CallbackProvider`1.CreateInstance(IContext context)
    at Ninject.Activation.Provider`1.Create(IContext context)
    at Ninject.Activation.Context.Resolve()
    at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding)
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
    at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
    at Ninject.Planning.Targets.Target`1.GetValue(Type service, IContext parent)
    at Ninject.Planning.Targets.Target`1.ResolveWithin(IContext parent)
    at Ninject.Activation.Providers.StandardProvider.GetValue(IContext context, ITarget target)
    at Ninject.Activation.Providers.StandardProvider.<>c__DisplayClass4.<Create>b__2(ITarget target)
    at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext()
    at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
    at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
    at Ninject.Activation.Providers.StandardProvider.Create(IContext context)
    at Ninject.Activation.Context.Resolve()
    at Ninject.KernelBase.<>c__DisplayClass10.<Resolve>b__c(IBinding binding)
    at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
    at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)
    at Ninject.Web.Mvc.NinjectDependencyResolver.GetService(Type serviceType)
    at System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType)


    InnerException: System.ArgumentException
    Message=type is not a ValueTypeType
    Parameter name: type
    Source=NHibernate
    ParamName=type
    StackTrace:
        at NHibernate.Id.TableGenerator.Configure(IType type, IDictionary`2 parms, Dialect dialect)
        at NHibernate.Id.IdentifierGeneratorFactory.Create(String strategy, IType type, IDictionary`2 parms, Dialect dialect)
        InnerException: