2012-05-02 21 views
7

Uczę się NHibernate, ale nie udało mi się. Wyczuwam, że komunikaty o błędach nie są dokładne.dziwny błąd NHibernate

Proszę o pomoc.

komunikat o błędzie jest

The following types may not be used as proxies: 
SecondSolution.Domain.Product: method get_Id should be 'public/protected virtual' or 'protected internal virtual' 
SecondSolution.Domain.Product: method set_Id should be 'public/protected virtual' or 'protected internal virtual' 
SecondSolution.Domain.Product: method get_Name should be 'public/protected virtual' or 'protected internal virtual' 
SecondSolution.Domain.Product: method set_Name should be 'public/protected virtual' or 'protected internal virtual' 
SecondSolution.Domain.Product: method get_Category should be 'public/protected virtual' or 'protected internal virtual' 
SecondSolution.Domain.Product: method set_Category should be 'public/protected virtual' or 'protected internal virtual' 
SecondSolution.Domain.Product: method get_Discontinued should be 'public/protected virtual' or 'protected internal virtual' 
SecondSolution.Domain.Product: method set_Discontinued should be 'public/protected virtual' or 'protected internal virtual' 
    at NHibernate.Cfg.Configuration.ValidateEntities() in c:\Users\oskar.berggren\Documents\Projects\nhibernate-core-3\src\NHibernate\Cfg\Configuration.cs:line 
1052 
    at NHibernate.Cfg.Configuration.Validate() in c:\Users\oskar.berggren\Documents\Projects\nhibernate-core-3\src\NHibernate\Cfg\Configuration.cs:line 959 
    at NHibernate.Cfg.Configuration.BuildSessionFactory() in c:\Users\oskar.berggren\Documents\Projects\nhibernate-core-3\src\NHibernate\Cfg\Configuration.cs:li 
ne 1251 
    at SecondSolution.Program.Main(String[] args) in C:\vs_workspace\SecondSolution\SecondSolution\Program.cs:line 22 
Press any key to continue . . . 

plik klasy

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace SecondSolution.Domain 
{ 
    class Product 
    { 
     public Product() 
     { 
      this.Name = "John"; 
     } 
     public Guid Id { get; set; }   
     public string Name { get; set; }   
     public string Category { get; set; }   
     public bool Discontinued { get; set; } 
    } 
} 

mapowanie

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"      
        assembly="SecondSolution"      
        namespace="SecondSolution.Domain"> 
    <class name="Product"> 
    <id name="Id"> 
     <generator class="guid" /> 
    </id> 
    <property name="Name" /> 
    <property name="Category" /> 
    <property name="Discontinued" /> 
    </class> 
</hibernate-mapping> 

config:

<?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="dialect">NHibernate.Dialect.MsSqlCeDialect</property> 
    <property name="connection.driver_class">NHibernate.Driver.SqlServerCeDriver</property> 
    <property name="connection.connection_string">Data Source=FirstSample.sdf</property> 
    <property name="show_sql">true</property> 
    </session-factory> 
</hibernate-configuration> 

Główna klasa

static void Main(string[] args) 
     { 
      try 
      { 
       Configuration cfg = new Configuration(); 
       cfg.Configure("Mappings/hibernate.cfg.xml"); 
       //cfg.Configure(); 

       cfg.AddAssembly(typeof(Product).Assembly); 

       NHibernate.ISessionFactory m_SessionFactory = cfg.BuildSessionFactory(); 
       NHibernate.ISession session = m_SessionFactory.OpenSession(); 
       Product product = new Product(); 
       session.SaveOrUpdate(product); 
      } catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
       Console.WriteLine(e.StackTrace); 
      } 

     } 

Odpowiedz

5

jak inni mówią - trzeba dokonać właściwości wirtualny. Ale to jest potrzebne tylko wtedy, gdy chcesz, aby jednostka, aby móc leniwy obciążenia, przeczytać o tym tutaj http://nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

Jeśli nie chcesz leniwy załadunku można ją wyłączyć

<class name="Product" Lazy="false"> 

Wtedy nie będziecie potrzebować wirtualnych nieruchomości.

+0

Jeśli używasz Fluent NHibernate: Not.LazyLoad(); – leojh

2

Musisz zadeklarować wszystkie swoje właściwości produktu jako virtual.

public virtual Guid Id { get; set; }   
public virtual string Name { get; set; }   
public virtual string Category { get; set; }   
public virtual bool Discontinued { get; set; } 
3

Jak mówi komunikat o błędzie, NHibernate wymaga, że ​​właściwości klasy podmiot oznaczony jako virtual:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace SecondSolution.Domain 
{ 
    class Product 
    { 
     public Product() 
     { 
      this.Name = "John"; 
     } 
     public virtual Guid Id { get; set; }   
     public virtual string Name { get; set; }   
     public virtual string Category { get; set; }   
     public virtual bool Discontinued { get; set; } 
    } 
} 
+0

to działa teraz. ale "Produkt" NIE jest zapisany w bazie danych. Czy ręcznie utworzę tabelę "Produkt" w bazie danych? – user595234

+1

Możesz utworzyć go samodzielnie lub pozwolić NHibernate to zrobić, proponuję przeczytać trochę tutaj http://nhforge.org/wikis/howtonh/your-first-nhibernate-based-application.aspx – Jon

+0

, że tutorial nie jest pomoc. – user595234

Powiązane problemy