1

Je travaille sur un projet où les entités sont décorées par des attributs de mappage NHibernate tels que [Propriété] et [Classe]. Malheureusement, RIAServices ne semble pas prendre en charge la plupart de ces attributs, ce qui provoque un échec lorsque RIAServices tente de générer le code client Silverlight.Les services RIA ne prennent pas en charge les entités qui sont décorées par des attributs de mappage NHibernate.

Lorsque je tente de construire une DomainService qui utilise une entité décorée avec [classe] ou [Propriété] attribut, je reçois un ArgumentNullException avec le message d'erreur suivant:

 
Error 2 The "CreateRiaClientFilesTask" task failed unexpectedly. 
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.ArgumentNullException: Value cannot be null. 
Parameter name: TypeName 
at System.RuntimeType.PrivateGetType(String typeName, Boolean throwOnError, Boolean ignoreCase, Boolean reflectionOnly, StackCrawlMark& stackMark) 
at System.Type.GetType(String typeName) 
at NHibernate.Mapping.Attributes.ClassAttribute.get_NameType() 
--- End of inner exception stack trace --- 
at System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 
at System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeTypeHandle typeOwner) 
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture) 
at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index) 
at System.Web.DomainServices.Tools.StandardCustomAttributeBuilder.GetPropertyValues(IEnumerable`1 propertyMaps, Attribute attribute) 
at System.Web.DomainServices.Tools.StandardCustomAttributeBuilder.GetAttributeDeclaration(Attribute attribute) 
at System.Web.DomainServices.Tools.CustomAttributeGenerator.GenerateCustomAttributes(ClientProxyGenerator proxyGenerator, CodeTypeDeclaration referencingType, IEnumerable`1 attributes, CodeCommentStatementCollection comments) 
at System.Web.DomainServices.Tools.CustomAttributeGenerator.GenerateCustomAttributes(ClientProxyGenerator proxyGenerator, CodeTypeDeclaration referencingType, IEnumerable`1 attributes, CodeAttributeDeclarationCollection outputCollection, CodeCommentStatementCollection comments) 
at System.Web.DomainServices.Tools.EntityProxyGenerator.Generate() 
at System.Web.DomainServices.Tools.ClientProxyGenerator.GenerateProxyClass(String& generatedCode) 
at System.Web.DomainServices.Tools.CreateRiaClientFilesTask.GenerateClientProxies() 
at System.Web.DomainServices.Tools.CreateRiaClientFilesTask.Execute() 
at Microsoft.Build.Framework.ITask.Execute() 
at Microsoft.Build.BuildEngine.TaskEngine.ExecuteInstantiatedTask(EngineProxy engineProxy, ItemBucket bucket, TaskExecutionMode howToExecuteTask, ITask task, Boolean& taskResult) SL 

Je sais que l'utilisation de Fluent NHibernate devrait résoudre le problème car il supprime le besoin de dépendances NHibernate, mais je veux d'abord m'assurer qu'il n'y a pas d'autres solutions avant de passer à Fluent NHibernate. Des pensées sur la résolution de ce problème?

+0

Il semble que cette exception provienne de la classe NHibernate.Mapping.Attributes.ClassAttribute de la propriété NameType, et non de RIA Services. – Bryant

+0

Les attributs de mappage NHibernate provoquent effectivement les exceptions. Si je supprime l'attribut [Class] alors les attributs [Property] provoquent la même exception, cette fois il commence à "NHibernate.Mapping.Attributes.PropertyAttribute.get_AccessType()". Je trouve difficile de voir où se situe le problème car Je ne peux pas déboguer la génération de code client (?). Il semble que RIAServices ne supporte pas tous les attributs de mappage NH, bien qu'ils soient sérialisables. Les attributs ne causent pas de problèmes dans le reste de l'application. –

Répondre

2

Comme je l'ai mentionné dans les commentaires, il semble que le problème est avec le lancement de NHibernate pendant la génération du code. Si vous voulez vraiment utiliser les attributs, je suggérerais d'obtenir le code source NHibernate et d'essayer d'attacher le débogueur VS à l'instance VS qui fait la génération du code, pourrait vous aider à comprendre pourquoi il échoue. Probablement une meilleure approche serait de suivre this post by Brada on using NHibernate with RIA Services ou watching this screencast on NHibernate with RIA Services. Ces deux endroits semblent avoir des exemples concrets de collaboration entre eux, alors commencez peut-être par là plutôt que de suivre la route que vous suivez.

+0

Il ne semble pas possible d'attacher le débogueur VS à l'instance VS qui effectue la génération de code. Je connais les messages que vous avez mentionnés et dans les deux messages, ils appliquent un autre (meilleur) moyen de mappage, mais avant de passer à Fluent NHibernate (ce qui prend beaucoup de temps dans ma situation), je veux m'assurer que ce n'est pas possible. –

0

Vous pouvez ajouter des directives de préprocesseur à vos entités afin que les attributs soient manquants lors de la compilation pour silverlight.

#if SILVERLIGHT 
//nothing 
#else 
[class] 
#endif 
public class entity{ 
} 
+0

Cela ressemble à une bonne solution, mais malheureusement, cela ne fonctionne pas non plus car il essaie toujours d'utiliser les attributs. –

0

Nous avons eu le même problème. Solution: Débarrassez-vous des attributs et utilisez simplement XML pour le mappage.

+0

C'est en effet une solution, je préfère utiliser FuentNHibernate avec l'automapping –

Questions connexes