Perhaps build a test to see if you can serialize your model using the  
XML serializer? That may provide a more meaningful exception, if that  
is your problem.

Sent from my mobile device. Please excuse any errors or omissions.

On Jan 3, 2010, at 9:54 AM, dylanj <[email protected]> wrote:

> Hi Markus, I stopped inheriting from ActiveRecordBase, and rebuild
> everything I still get the same error.
>
> On Jan 3, 9:01 am, Markus Zywitza <[email protected]> wrote:
>> When you send your entities over the wire, you better don't inherit
>> from ActiveRecordBase.
>> Perhaps this solves your problem.
>>
>> -Markus
>>
>> 2010/1/3 dylanj <[email protected]>:
>>
>>> Hi All,
>>
>>> Sorry if this is a n00b thing to ask - I've only been into DotNet/C#
>>> for about two weeks.
>>
>>> But basicly what I am trying to do is expose DAO's throught WCF
>>> services.
>>
>>> The problem is when I try to call the Service from the client I get
>>> the following exception : Test method
>>> jTekPos.Client.RemoteProxy.Tests.UserProxy_Fixture.Can_We_Lookup_A_Member
 

>>> threw exception:  System.ServiceModel.FaultException`1
>>> [System.ServiceModel.ExceptionDetail]: No persister for: User.
>>
>>> I believe ( from what I have googled ) that it has something to do
>>> with the Serializer not serializing the references properly, But I
>>> have spent way to long googling and really need some help now.
>>
>>> My User.cs is defined here :
>>
>>> [code]
>>> namespace jTekPos.Data.Model
>>> {
>>>    [Serializable]
>>>    [DataContract]
>>>    [ActiveRecord("usrs")]
>>>    public class User : ActiveRecordBase<User>
>>>    {
>>>        [DataMember]
>>>        [PrimaryKey("user_id")]
>>>        public int UserId { get; set; }
>>
>>>        [DataMember]
>>>        [Property("user_name")]
>>>        public String Username { get; set; }
>>
>>>        [DataMember]
>>>        [Property("pass_word")]
>>>        public String Password { get; set; }
>>
>>>        [DataMember]
>>>        [Property("firstname")]
>>>        public String Firstname { get; set; }
>>
>>>        [DataMember]
>>>        [Property("surname")]
>>>        public String Surname { get; set; }
>>
>>>        [DataMember]
>>>        [HasAndBelongsToMany(typeof(Role),
>>>            Table = "usr_role_link", ColumnKey = "user_id", ColumnRef
>>> = "role_id",
>>>            Cascade = ManyRelationCascadeEnum.AllDeleteOrphan, Lazy =
>>> true)]
>>>        public IList<Role> Roles { get; set; }
>>>    }
>>> }
>>> [/code]
>>
>>> My Role.cs is defined here :
>>> [code]
>>> namespace jTekPos.Data.Model
>>> {
>>>    [Serializable]
>>>    [DataContract]
>>>    [ActiveRecord("user_role")]
>>>    public class Role : ActiveRecordBase<Role>
>>>    {
>>>        [DataMember]
>>>        [PrimaryKey("role_id")]
>>>        public int RoleId { get; set; }
>>
>>>        [DataMember]
>>>        [Property("role_name")]
>>>        public String RoleName { get; set; }
>>
>>>        [DataMember]
>>>        [Property("role_desc")]
>>>        public String RoleDescription { get; set; }
>>
>>>        [DataMember]
>>>        [HasAndBelongsToMany(typeof(User),
>>>            Table = "user_role_link", ColumnKey = "role_id",  
>>> ColumnRef
>>> = "user_id",
>>>            Inverse = true, Cascade =
>>> ManyRelationCascadeEnum.SaveUpdate, Lazy = true)]
>>>        public IList<User> Users { get; set; }
>>
>>>        [DataMember]
>>>        [HasAndBelongsToMany(typeof(Permission),
>>>            Table = "role_perm_link", ColumnKey = "role_id",  
>>> ColumnRef
>>> = "perm_id",
>>>            Cascade = ManyRelationCascadeEnum.AllDeleteOrphan, Lazy =
>>> true)]
>>>        public IList<Permission> Permissions { get; set; }
>>>    }
>>> }
>>> [/code]
>>
>>> The DAO that I expose (UserDAO.cs) :
>>> [code]
>>> namespace jTekPos.Data.AccessObject
>>> {
>>>    [ServiceContract(Namespace="www.#####co.za/jTekPos/
>>> DataAccessObject/User")]
>>>    [ServiceBehavior(IncludeExceptionDetailInFaults=true,
>>> MaxItemsInObjectGraph=1000)]
>>>    public class UserDao : StandardDao<User>
>>>    {
>>>        [OperationContract]
>>>        [PreserveCircularReferences]
>>>        public virtual User FindUserById( int id )
>>>        {
>>>            return GetSingleResultFromCriteria
>>> (MakeOneParamSimpleEqCriteria("Id", id));
>>>        }
>>
>>>        [OperationContract]
>>>        [PreserveCircularReferences]
>>>        public virtual User FindUserByUsername(String username)
>>>        {
>>>            return GetSingleResultFromCriteria
>>> (MakeOneParamSimpleEqCriteria("Username", username));
>>>        }
>>>    }
>>> }
>>> [/code]
>>
>>> The UserDao extends StandardDAO.cs thats this :
>>> [code]
>>
>>> namespace jTekPos.Data.AccessObject
>>> {
>>>    public abstract class StandardDao<T>
>>>    {
>>>        public readonly ISession _Session;
>>>        public T _BaseEntity;
>>
>>>        public StandardDao()
>>>        {
>>>            ISessionFactory factory =
>>>                ObjectFactory.GetInstance<ISessionFactory>();
>>>            _Session = factory.OpenSession();
>>>            _BaseEntity = (T)
>>>                typeof(T).GetConstructor(new Type[]{}).Invoke(new
>>> Object[]{});
>>>        }
>>
>>>        public ICriteria MakeCriteria()
>>>        {
>>>            return _Session.CreateCriteria(typeof(T).Name);
>>>        }
>>
>>>        public ICriteria MakeOneParamSimpleEqCriteria(String
>>> PropertyName, Object Value)
>>>        {
>>>            ICriteria crit = MakeCriteria();
>>>            crit.Add(Restrictions.Eq(PropertyName, Value));
>>>            return crit;
>>>        }
>>
>>>        public T GetSingleResultFromCriteria(ICriteria iCrit)
>>>        {
>>>            iCrit.SetMaxResults(1);
>>>            IList<T> lst = iCrit.List<T>();
>>>            if (lst == null || lst.Count == 0)
>>>                return default(T);
>>>            return lst[0];
>>>        }
>>>    }
>>> }
>>
>>> [/code]
>>
>>> I followed an Microsoft article recommending me to create these
>>> (supposed to help the dataContractSerializer preserver my
>>> references) :
>>
>>> [b]OpBehaviourPreserveRefs.cs[/b]
>>> [code]
>>> public class OpBehaviourPreserveRefs :
>>> DataContractSerializerOperationBehavior
>>>    {
>>>         public OpBehaviourPreserveRefs ( OperationDescription
>>> operationDescription) : base(operationDescription) { }
>>
>>>         public override XmlObjectSerializer CreateSerializer( Type
>>> type, string name, string ns, IList<Type> knownTypes)
>>>         {
>>>            return CreateDataContractSerializer(type, name, ns,
>>> knownTypes);
>>>         }
>>
>>>         private static XmlObjectSerializer
>>> CreateDataContractSerializer( Type type, string name, string ns,
>>> IList<Type> knownTypes)
>>>         {
>>>            return CreateDataContractSerializer(type, name, ns,
>>> knownTypes);
>>>         }
>>
>>>         public override XmlObjectSerializer CreateSerializer( Type
>>> type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type>
>>> knownTypes)
>>>         {
>>>             return new DataContractSerializer(type, name, ns,
>>> knownTypes, 0x7FFF, false, true, null);
>>>         }
>>>    }
>>> [/code]
>>
>>> [b]The attribute : [/b]
>>> [code]
>>>  public class PreserveCircularReferencesAttribute : Attribute,
>>> IOperationBehavior
>>>    {
>>>        public void AddBindingParameters(OperationDescription
>>> description, BindingParameterCollection parameters) { }
>>
>>>        public void ApplyClientBehavior(OperationDescription
>>> description, ClientOperation proxy) {
>>>            IOperationBehavior innerBehavior =
>>>              new OpBehaviourPreserveRefs(description);
>>>            innerBehavior.ApplyClientBehavior(description, proxy);
>>>        }
>>
>>>        public void ApplyDispatchBehavior(OperationDescription
>>> description, DispatchOperation dispatch)
>>>        {
>>>            IOperationBehavior innerBehavior =
>>>              new OpBehaviourPreserveRefs(description);
>>>            innerBehavior.ApplyDispatchBehavior(description,
>>> dispatch);
>>>        }
>>
>>>        public void Validate(OperationDescription description) { }
>>>    }
>>> [/code]
>>
>>> And Then to host these I tried the standard selfHost option, and  
>>> tried
>>> the WcfIntegration package from Castle :
>>
>>> [b]IServiceHostCache.cs[/b]
>>> [code]
>>>  public abstract class IServiceHostCache
>>>    {
>>>        public const String URI_TEMPLATE =
>>>            "http://${BindAddress}:${Port}/jtek/wcf/${ServiceType}/$
>>> {ServiceName}";
>>
>>>        public IList<Object> RunningServiceHosts =
>>>            new List<Object>();
>>
>>>        public abstract void HostService(String ServiceName, String
>>> ServiceType, Type ServiceContractImpl);
>>
>>>        public Uri GenerateServiceUri(string ServiceName, string
>>> ServiceType)
>>>        {
>>>            return new Uri(URI_TEMPLATE
>>>                .Replace("${BindAddress}", "localhost")
>>>                .Replace("${Port}", "8000")
>>>                .Replace("${ServiceType}", ServiceType)
>>>                .Replace("${ServiceName}", ServiceName));
>>>        }
>>
>>>        public abstract void Destroy();
>>> [/code]
>>
>>> [b]Standard WCF impl:[/b]
>>> [code]
>>>  public class WcfBasedServiceHostCache : IServiceHostCache
>>>    {
>>>        public override void HostService(String ServiceName, String
>>> ServiceType, Type ServiceContractImpl)
>>>        {
>>>            Uri uri = GenerateServiceUri( ServiceName, ServiceType );
>>>            ServiceHost host =
>>>                new ServiceHost( ServiceContractImpl , uri );
>>>            try
>>>            {
>>>                host.AddServiceEndpoint(
>>>                    ServiceContractImpl,
>>>                    new WSHttpBinding(),
>>>                    ServiceName);
>>>                ServiceMetadataBehavior httpGetBehaviour =
>>>                    new ServiceMetadataBehavior();
>>>                httpGetBehaviour.HttpGetEnabled = true;
>>>                host.Description.Behaviors.Add( httpGetBehaviour );
>>>                host.Open();
>>>                RunningServiceHosts.Add(host);
>>>            }
>>>            catch (CommunicationException ce)
>>>            {
>>>                host.Abort();
>>>                throw new Exception("Something Bad
>>
>> ...
>>
>> read more ยป
>
> --
>
> You received this message because you are subscribed to the Google  
> Groups "Castle Project Users" group.
> To post to this group, send email to [email protected] 
> .
> To unsubscribe from this group, send email to 
> [email protected] 
> .
> For more options, visit this group at 
> http://groups.google.com/group/castle-project-users?hl=en 
> .
>
>

--

You received this message because you are subscribed to the Google Groups 
"Castle Project Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/castle-project-users?hl=en.


Reply via email to