2010-07-27 54 views
3

我在应用NHibernate Fluent Automapping时遇到了一些问题。它在测试项目中效果很好。但现在..需要关于'没有persister'的帮助:'Fluent Nhibernate Automapping的例外

Test method [PROJECTNAME].SubscriptionTest.SubscriptionConstructorTest threw exception: NHibernate.MappingException: No persister for: [PROJECTLIB].SubscriptionManagerRP 

类(然后再次,相同的异常以更简单的TestClass出现 - 这样的问题不应该在这里):

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.4927")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://docs.oasis-open.org/wsn/b-2")] 
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "http://docs.oasis-open.org/wsn/b-2", IsNullable = false)] 
    [System.Runtime.Serialization.DataContractAttribute(Name = "SubscriptionManagerRP", Namespace = "http://docs.oasis-open.org/wsn/b-2")] 
    public class SubscriptionManagerRP 
    { 

     private string id; 

     public string Id 
     { 
      get 
      { 
       return id; 
      } 
      set 
      { 
       id = value; 
      } 
     } 

     public Boolean Save() 
     { 
      DatabaseAccess access = new DatabaseAccess(); 
      var sessionFactory = access.getSessionFactory(); 

      //try 
      //{ 
       using (var session = sessionFactory.OpenSession()) 
       { 
        using (var transaction = session.BeginTransaction()) 
        { 


         SaveTextMess(this.ToString()); 
         session.Save(this); 
         transaction.Commit(); 
         return true; 
        } 
       } 
      //} 
      //catch (Exception e) 
      //{ 
      // SaveTextMess("ERROR: " + e); 
      // Console.WriteLine(e); 
      //} 

      //SaveTextMess("false"); 
      return false; 
     } 

     private void SaveTextMess(String output) 
     { 
      //Just for Demo purposes, saving text file per message that should be sent 

      // create a writer and open the file 
      TextWriter tw = new StreamWriter("C:\\Temp\\CespSubscriptionManagerRPMessage.txt"); 

      // write a line of text to the file 
      tw.WriteLine(output); 

      // close the stream 
      tw.Close(); 
     } 

//################################### 




     [EditorBrowsable(EditorBrowsableState.Never)] 
     private EndpointReferenceType consumerReferenceField; 

     [EditorBrowsable(EditorBrowsableState.Never)] 
     private FilterType filterField; 

     [EditorBrowsable(EditorBrowsableState.Never)] 
     private SubscriptionPolicyType subscriptionPolicyField; 

     [EditorBrowsable(EditorBrowsableState.Never)] 
     private System.DateTime creationTimeField; 

     [EditorBrowsable(EditorBrowsableState.Never)] 
     private bool creationTimeFieldSpecified; 

     private static System.Xml.Serialization.XmlSerializer serializer; 

     /// <summary> 
     /// .ctor class constructor 
     /// </summary> 
     public SubscriptionManagerRP() 
     { 
      this.subscriptionPolicyField = new SubscriptionPolicyType(); 
      this.filterField = new FilterType(); 
      this.consumerReferenceField = new EndpointReferenceType(); 
     } 

     [System.Runtime.Serialization.DataMemberAttribute()] 
     public EndpointReferenceType ConsumerReference 
     { 
      get 
      { 
       return this.consumerReferenceField; 
      } 
      set 
      { 
       this.consumerReferenceField = value; 
      } 
     } 

     [System.Runtime.Serialization.DataMemberAttribute()] 
     public FilterType Filter 
     { 
      get 
      { 
       return this.filterField; 
      } 
      set 
      { 
       this.filterField = value; 
      } 
     } 

     [System.Runtime.Serialization.DataMemberAttribute()] 
     public SubscriptionPolicyType SubscriptionPolicy 
     { 
      get 
      { 
       return this.subscriptionPolicyField; 
      } 
      set 
      { 
       this.subscriptionPolicyField = value; 
      } 
     } 

     [System.Runtime.Serialization.DataMemberAttribute()] 
     public System.DateTime CreationTime 
     { 
      get 
      { 
       return this.creationTimeField; 
      } 
      set 
      { 
       this.creationTimeField = value; 
      } 
     } 

     [System.Xml.Serialization.XmlIgnoreAttribute()] 
     [System.Runtime.Serialization.DataMemberAttribute()] 
     public bool CreationTimeSpecified 
     { 
      get 
      { 
       return this.creationTimeFieldSpecified; 
      } 
      set 
      { 
       this.creationTimeFieldSpecified = value; 
      } 
     } 

     private static System.Xml.Serialization.XmlSerializer Serializer 
     { 
      get 
      { 
       if ((serializer == null)) 
       { 
        serializer = new System.Xml.Serialization.XmlSerializer(typeof(SubscriptionManagerRP)); 
       } 
       return serializer; 
      } 
     } 

     #region Serialize/Deserialize 
     /// <summary> 
     /// Serializes current SubscriptionManagerRP object into an XML document 
     /// </summary> 
     // <returns>string XML value</returns> 
     public virtual string WriteObject() 
     { 
      System.IO.StreamReader streamReader = null; 
      System.IO.MemoryStream memoryStream = null; 
      try 
      { 
       memoryStream = new System.IO.MemoryStream(); 
       Serializer.Serialize(memoryStream, this); 
       memoryStream.Seek(0, System.IO.SeekOrigin.Begin); 
       streamReader = new System.IO.StreamReader(memoryStream); 
       return streamReader.ReadToEnd(); 
      } 
      finally 
      { 
       if ((streamReader != null)) 
       { 
        streamReader.Dispose(); 
       } 
       if ((memoryStream != null)) 
       { 
        memoryStream.Dispose(); 
       } 
      } 
     } 

     /// <summary> 
     /// Deserializes workflow markup into an SubscriptionManagerRP object 
     /// </summary> 
     // <param name="xml">string workflow markup to deserialize</param> 
     // <param name="obj">Output SubscriptionManagerRP object</param> 
     // <param name="exception">output Exception value if deserialize failed</param> 
     // <returns>true if this XmlSerializer can deserialize the object; otherwise, false</returns> 
     public static bool ReadObject(string xml, out SubscriptionManagerRP obj, out System.Exception exception) 
     { 
      exception = null; 
      obj = default(SubscriptionManagerRP); 
      try 
      { 
       obj = ReadObject(xml); 
       return true; 
      } 
      catch (System.Exception ex) 
      { 
       exception = ex; 
       return false; 
      } 
     } 

     public static bool ReadObject(string xml, out SubscriptionManagerRP obj) 
     { 
      System.Exception exception = null; 
      return ReadObject(xml, out obj, out exception); 
     } 

     public static SubscriptionManagerRP ReadObject(string xml) 
     { 
      System.IO.StringReader stringReader = null; 
      try 
      { 
       stringReader = new System.IO.StringReader(xml); 
       return ((SubscriptionManagerRP)(Serializer.Deserialize(System.Xml.XmlReader.Create(stringReader)))); 
      } 
      finally 
      { 
       if ((stringReader != null)) 
       { 
        stringReader.Dispose(); 
       } 
      } 
     } 

     /// <summary> 
     /// Serializes current SubscriptionManagerRP object into file 
     /// </summary> 
     // <param name="fileName">full path of outupt xml file</param> 
     // <param name="exception">output Exception value if failed</param> 
     // <returns>true if can serialize and save into file; otherwise, false</returns> 
     public virtual bool SaveToFile(string fileName, out System.Exception exception) 
     { 
      exception = null; 
      try 
      { 
       SaveToFile(fileName); 
       return true; 
      } 
      catch (System.Exception e) 
      { 
       exception = e; 
       return false; 
      } 
     } 

     public virtual void SaveToFile(string fileName) 
     { 
      System.IO.StreamWriter streamWriter = null; 
      try 
      { 
       string xmlString = WriteObject(); 
       System.IO.FileInfo xmlFile = new System.IO.FileInfo(fileName); 
       streamWriter = xmlFile.CreateText(); 
       streamWriter.WriteLine(xmlString); 
       streamWriter.Close(); 
      } 
      finally 
      { 
       if ((streamWriter != null)) 
       { 
        streamWriter.Dispose(); 
       } 
      } 
     } 

     /// <summary> 
     /// Deserializes workflow markup from file into an SubscriptionManagerRP object 
     /// </summary> 
     // <param name="xml">string workflow markup to deserialize</param> 
     // <param name="obj">Output SubscriptionManagerRP object</param> 
     // <param name="exception">output Exception value if deserialize failed</param> 
     // <returns>true if this XmlSerializer can deserialize the object; otherwise, false</returns> 
     public static bool LoadFromFile(string fileName, out SubscriptionManagerRP obj, out System.Exception exception) 
     { 
      exception = null; 
      obj = default(SubscriptionManagerRP); 
      try 
      { 
       obj = LoadFromFile(fileName); 
       return true; 
      } 
      catch (System.Exception ex) 
      { 
       exception = ex; 
       return false; 
      } 
     } 

     public static bool LoadFromFile(string fileName, out SubscriptionManagerRP obj) 
     { 
      System.Exception exception = null; 
      return LoadFromFile(fileName, out obj, out exception); 
     } 

     public static SubscriptionManagerRP LoadFromFile(string fileName) 
     { 
      System.IO.FileStream file = null; 
      System.IO.StreamReader sr = null; 
      try 
      { 
       file = new System.IO.FileStream(fileName, FileMode.Open, FileAccess.Read); 
       sr = new System.IO.StreamReader(file); 
       string xmlString = sr.ReadToEnd(); 
       sr.Close(); 
       file.Close(); 
       return ReadObject(xmlString); 
      } 
      finally 
      { 
       if ((file != null)) 
       { 
        file.Dispose(); 
       } 
       if ((sr != null)) 
       { 
        sr.Dispose(); 
       } 
      } 
     } 
     #endregion 

     #region Clone method 
     /// <summary> 
     /// Create a clone of this SubscriptionManagerRP object 
     /// </summary> 
     public virtual SubscriptionManagerRP Clone() 
     { 
      return ((SubscriptionManagerRP)(this.MemberwiseClone())); 
     } 
     #endregion 
    } 

从类的保存方法上述(看起来简单TestClass的是,在测试项目中的工作原理相同):

public Boolean Save() 
     { 
      DatabaseAccess access = new DatabaseAccess(); 
      var sessionFactory = access.getSessionFactory(); 

      //try 
      //{ 
       using (var session = sessionFactory.OpenSession()) 
       { 
        using (var transaction = session.BeginTransaction()) 
        { 


         SaveTextMess(this.ToString()); 
         session.Save(this); 
         transaction.Commit(); 
         return true; 
        } 
       } 
      //} 
      //catch (Exception e) 
      //{ 
      // SaveTextMess("ERROR: " + e); 
      // Console.WriteLine(e); 
      //} 

      //SaveTextMess("false"); 
      return false; 
     } 

我在哪里设置连接字符串和会话工厂:

class SessionFactoryController 
    { 

     public SessionFactoryController() 
     { 

     } 

     public ISessionFactory GiveFactory() 
     { 
      return CreateSessionFactory(); 
     } 

     private static void ReferByteCode(){ 

      //Just to make sure the ByteCodeCastle is loaded 
      ProxyFactory fake = new ProxyFactory(); 
     } 

     private static ISessionFactory CreateSessionFactory() 
     { 
      ReferByteCode(); 

      var cfg = new FluentNhibernateConfiguration(); 

      return Fluently.Configure() 
       .Database(
       FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2005 
        .ConnectionString("[SERVER];Database=Pets;User ID=NHibernateTester;Password=[PASSWORD];Trusted_Connection=False;") 
      ) 

       .Mappings(m => 
        m.AutoMappings 
        .Add(AutoMap.AssemblyOf<SubscriptionManagerRP>(cfg)) 
       ) 

       .BuildSessionFactory(); 
     } 

    } 

配置:

class NotifyFluentNhibernateConfiguration : DefaultAutomappingConfiguration 
    { 
     public override bool ShouldMap(Type type) 
     { 
      return type.Namespace == "System.Xml.XmlAttribute"; 
     } 
    } 

的配置是处理较早的映射例外 'System.Xml.XmlAttribute'。

如果数据库设置不正确,是否可能出现此错误?我已经完成了一个测试,使用一个类,我知道NHibernate Automapping(从另一个项目)测试数据库(与其他项目相同)。我仍然得到同样的例外,但是对于'简单'类。

所以这不是课堂。

它不是连接字符串,因为它是从另一个很棒的项目中复制而来的。

它不是数据库上的设置(或至少安全/访问设置)。我认为如果我错误地配置了表格,它应该会出现另一个错误,如前所述,当我将它指向另一个项目中的某些东西时,我会得到相同的异常。

我已经删除了一切,并重写了一次,只是为了确保我没有做一些小小的愚蠢错误。如果是这样,我做了两次。

如上所述,如你所见。 这段代码非常非常简单。唯一复杂的是班级。即使我将它改为一个非常非常简单的类,我也会得到相同的异常。

有什么想法吗?

+0

你有没有想过这个?我遇到了同样的问题。 – 2010-11-02 14:34:02

+0

你有一些课程来标记公众(或内部也许)吗? http://2bhere4u.blogspot.com/2010/01/nhibernatemappingexception-no-persister.html – 2011-05-02 20:29:57

+0

我认为它可能是'返回type.Namespace ==“System.Xml.XmlAttribute”'。其缺失的|| type.Namespace ==“PROJECTLIB”' – Firo 2011-07-25 13:17:35

回答

0

如果您的类不在System.Xml.XmlAttribute命名空间中,它将不会被automapping映射。很难相信你的课程在这个名字空间中。如果你希望它被映射,ShouldMap应该为你的类型返回true。