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.
