2013-01-08 16 views
5

Jestem nowicjuszem w NHibernate. Próbuję użyć tego ORM z SQLite. mam następujące: projectNHibernate.MappingException: Nie można skompilować dokumentu mapowania

Product.cs

namespace Stock.Models.Classes 
{ 
    class Product 
    { 
     public virtual string Name {get; set;} 
     public virtual int Id { get; set; } 
     public virtual decimal Price { get; set; } 
     public virtual decimal Quantity { get; set; } 
    } 
} 

Product.hbm.xml

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="Stock.Models" 
        namespace="Stock.Models.Classes"> 
    <class name="Product" table="products"> 
    <id name="Id"> 
     <generator class="int" /> 
    </id> 
    <property name="Name" /> 
    <property name="Price" /> 
    <property name="Quantity" /> 
    </class> 
</hibernate-mapping> 

hibernate.cfg.xml

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2"> 
    <session-factory> 
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 
    <property name="connection.driver_class">NHibernate.Driver.SQLite20Driver</property> 
    <property name="connection.connection_string">Data Source=nhibernate.db;Version=3</property> 
    <property name="dialect">NHibernate.Dialect.SQLiteDialect</property> 
    <property name="query.substitutions">true=1;false=0</property> 
    <property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property> 
    <property name="show_sql">true</property> 
    </session-factory> 
</hibernate-configuration> 

Próbuję przetestować w Program.cs. Program.cs

namespace Stock 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      //Application.Run(new Form1()); 
      var cfg = new Configuration(); 
      cfg.Configure(); 
       cfg.AddAssembly(typeof(Product).Assembly); 
     } 
    } 
} 

W czasie wykonywania aplikacji przerwy w linii cfg.AddAssembly(typeof(Product).Assembly); z komunikatem w okienko: Could not compile the mapping document: Stock.Models.Mappings.Product.hbm.xml oraz w konsoli:

The thread 'vshost.LoadReference' (0x10a8) has exited with code 0 (0x0). 
'Stock.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\...\Projects\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Stock.exe', Symbols loaded. 
'Stock.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\...\Projects\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\NHibernate.dll' 
'Stock.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled. 
'Stock.vshost.exe' (Managed (v4.0.30319)): Loaded 'jsw3tdap' 
'Stock.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:\...\Projects\WindowsFormsApplication1\WindowsFormsApplication1\bin\Debug\Iesi.Collections.dll' 
A first chance exception of type 'NHibernate.MappingException' occurred in NHibernate.dll 

Jeśli dodać try/catch w Program.cs:

try 
    { 
     cfg.AddAssembly(typeof(Product).Assembly); 
    } 
catch (Exception e) { Console.WriteLine(e); } 

otrzymuję (con podeszwa):

A first chance exception of type 'NHibernate.MappingException' occurred in NHibernate.dll 
NHibernate.MappingException: Could not compile the mapping document: Stock.Models.Mappings.Product.hbm.xml ---> NHibernate.MappingException: persistent class Stock.Models.Classes.Product, Stock.Models not found ---> System.IO.FileNotFoundException: Could not load file or assembly 'Stock.Models' or one of its dependencies. El sistema no puede encontrar el archivo especificado. 
    at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.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) 
    --- End of inner exception stack trace --- 
    at NHibernate.Cfg.XmlHbmBinding.Binder.ClassForFullNameChecked(String fullName, String errorMessage) 
    at NHibernate.Cfg.XmlHbmBinding.Binder.ClassForNameChecked(String name, Mappings mappings, String errorMessage) 
    at NHibernate.Cfg.XmlHbmBinding.ClassBinder.BindClass(IEntityMapping classMapping, PersistentClass model, IDictionary`2 inheritedMetas) 
    at NHibernate.Cfg.XmlHbmBinding.RootClassBinder.Bind(HbmClass classSchema, IDictionary`2 inheritedMetas) 
    at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddRootClasses(HbmClass rootClass, IDictionary`2 inheritedMetas) 
    at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.AddEntitiesMappings(HbmMapping mappingSchema, IDictionary`2 inheritedMetas) 
    at NHibernate.Cfg.XmlHbmBinding.MappingRootBinder.Bind(HbmMapping mappingSchema) 
    at NHibernate.Cfg.Configuration.AddDeserializedMapping(HbmMapping mappingDocument, String documentFileName) 
    --- End of inner exception stack trace --- 
    at NHibernate.Cfg.Configuration.LogAndThrow(Exception exception) 
    at NHibernate.Cfg.Configuration.AddDeserializedMapping(HbmMapping mappingDocument, String documentFileName) 
    at NHibernate.Cfg.Configuration.AddValidatedDocument(NamedXmlDocument doc) 
    at NHibernate.Cfg.Configuration.ProcessMappingsQueue() 
    at NHibernate.Cfg.Configuration.AddDocumentThroughQueue(NamedXmlDocument document) 
    at NHibernate.Cfg.Configuration.AddXmlReader(XmlReaThe thread 'vshost.RunParkingWindow' (0x1700) has exited with code 0 (0x0). 
The thread '<No Name>' (0x5d4) has exited with code 0 (0x0). 
The program '[4428] Stock.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0). 
The program '[4428] Stock.vshost.exe: Program Trace' has exited with code 0 (0x0). 
der hbmReader, String name) 
    at NHibernate.Cfg.Configuration.AddInputStream(Stream xmlInputStream, String name) 
    at NHibernate.Cfg.Configuration.AddResource(String path, Assembly assembly) 
    at NHibernate.Cfg.Configuration.AddAssembly(Assembly assembly) 
    at Stock.Program.Main() in C:\Users\Cristhian\documents\visual studio 2010\Projects\WindowsFormsApplication1\WindowsFormsApplication1\Program.cs:line 25 

pliki XML są seted jak Embedded Resource i Copy Always. Dlaczego nie można skompilować dokumentu mapowania Stock.Models.Mappings.Product.hbm.xml? Czy problem dotyczy formatu pliku lub biblioteki DLL?

Odpowiedz

9

Zestaw Stock.Models nie istnieje. Jedyny zespół, który istnieje jest Stock, więc trzeba zmienić plik odwzorowania odpowiednio:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="Stock" 
        namespace="Stock.Models.Classes"> 
0

miałem ten sam problem. Jest w "zespole" i "przestrzeni nazw". To, co zrobiłem, aby go rozwiązać, to wymienić oba, w twoim przykładzie, "zapas".

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="Stock" 
        namespace="Stock"> 
0

Otrzymałem ten sam błąd, mimo że moje pliki odwzorowań są poprawne.

Okazało się, że zaktualizowane zespoły nie były obecne w folderze C:\inetpub\wwwroot\wss\VirtualDirectories\<port>\bin. Kiedy kopiowałem je ręcznie, zadziałało.

Nie mam wytłumaczenia, dlaczego nie są jeszcze kopiowane, a nawet jeśli powinny, to zamieszczam to jako odpowiedź, ponieważ rozwiązało to problem i nie widziałem tego udokumentowane nigdzie indziej w Internecie.

1

należy dodać zespół i przestrzeń nazw w pliku hbm.xml. Aby znaleźć nazwę assemply użycia typeof (yourModel) .Assembly i sprawdź fullName. nazwa zespołu i klasy to nie to samo.

Powiązane problemy