Как настроить отображение классов NHibernate из IronPython? - PullRequest
4 голосов
/ 24 декабря 2009

Я пытаюсь использовать NHibernate от IronPython. Я скопировал зависимости NHibernate в мой каталог C: \ Users \ shamel \ python \ HelloPy \ libs.

У меня есть этот код IronPython:

import sys
sys.path.append("C:\Users\shamel\python\HelloPy\libs") 

import clr
clr.AddReference("NHibernate")
clr.AddReference("LinFu.DynamicProxy")
clr.AddReference("NHibernate.ByteCode.LinFu")

from Entities.Entity import Customer 
from NHibernate.Cfg import Configuration

configuration = Configuration();
configuration.Configure("PocoLib.cfg.xml");
configuration.AddXmlFile("Customer.hbm.xml");
factory = configuration.BuildSessionFactory();

Мои классы сущностей определены в Entity.py в пакете Entity. Это объясняет from Entities.Entity import Customer.

Вот как выглядит мой файл Customer.hbm.xml

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
               assembly="Entities"
               namespace="Entities">

<class name="Customer" lazy="false">
...
</class>

Программа не работает в конфигурации. AddXmlFile ("Customer.hbm.xml"); строка:

configuration.AddXmlFile("Customer.hbm.xml");
StandardError: Could not compile the mapping document: Customer.hbm.xml
ERROR: Module: nhtests could not be imported.

Полагаю, NHibernate не может разрешить assembly и namespace, указанные в заголовке hibernate-mapping. (Проблема не в том, что xml-файл не найден; я пробовал с именем, которого не существует, и получаю другую ошибку)

Любая помощь будет принята с благодарностью.

Sly

РЕДАКТИРОВАТЬ: 27 декабря 2009 : Вот трассировка стека. Я думаю, это подтверждает, что NHibernate не может найти мои типы.

*** Outer ***
MappingException
persistent class Entities.Customer, Entities not found
at Microsoft.Scripting.Actions.Calls.MethodCandidate.Caller.CallWithInstance(Object[] args, Boolean& shouldOptimize)
at IronPython.Runtime.Types.BuiltinFunction.BuiltinMethodCaller`2.Call1(CallSite site, CodeContext context, TFuncType func, T0 arg0)
at System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2)
at Microsoft.Scripting.Utils.InvokeHelper`6.Invoke(Object arg0, Object arg1, Object arg2, Object arg3, Object arg4)
at Microsoft.Scripting.Utils.ReflectedCaller.Invoke(Object[] args)
at Microsoft.Scripting.Interpreter.CallInstruction.Run(InterpretedFrame frame)
at Microsoft.Scripting.Interpreter.Interpreter.Run(InterpretedFrame frame)
*** Inner ***
MappingException
persistent class Entities.Customer, Entities not found
at NHibernate.Cfg.XmlHbmBinding.Binder.ClassForFullNameChecked(String fullName, String errorMessage)
at NHibernate.Cfg.XmlHbmBinding.ClassBinder.BindClass(XmlNode node, IDecoratable classMapping, PersistentClass model, IDictionary`2 inheritedMetas)
at NHibernate.Cfg.XmlHbmBinding.RootClassBinder.Bind(XmlNode node, HbmClass classSchema, IDictionary`2 inheritedMetas)
at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddRootClasses(XmlNode parentNode, IDictionary`2 inheritedMetas)
at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.Bind(XmlNode node)
at NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc)
*** Inner Inner ***
FileNotFoundException
Could not load file or assembly 'Entities' or one of its dependencies. The system cannot find the file specified.
at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.Load(String assemblyString)
at NHibernate.Util.ReflectHelper.TypeFromAssembly(AssemblyQualifiedTypeName name, Boolean throwOnError)
at NHibernate.Util.ReflectHelper.ClassForName(String name)
at NHibernate.Cfg.XmlHbmBinding.Binder.ClassForFullNameChecked(String fullName, String errorMessage)

РЕДАКТИРОВАТЬ 29 декабря 2009 : Даже после того, как я решу проблему с именем пространства / имени сборки, я не думаю, что Nhibernate сможет сохранить / загрузить мои объекты Python. Насколько теперь понятно, когда экземпляр Python передается в статически типизированную библиотеку (например, NHibernate), эта библиотека не видит своих членов. Поэтому Nhibernate не найдет никаких свойств для моего типа, потому что эти свойства не видны для статически типизированных библиотек. Чтобы это работало, NHibernate должен был бы поддерживать интеграцию DLR, возможно, используя ключевое слово C # 4.0 Dynamic. Продолжение следует ...

1 Ответ

1 голос
/ 20 января 2010

Невозможно использовать NHibernate из IronPython для сущностей, определенных в IronPython.

...