2012-05-02 20 views
7

Sto imparando NHibernate, ma non sono riuscito. Sento che i messaggi di errore non sono accurati.Errore strano NHibernate

Per favore aiuto.

messaggio di errore è

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 . . . 

file di classe

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; } 
    } 
} 

mappatura

<?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> 

classe principale

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); 
      } 

     } 

risposta

5

Mentre gli altri dicono - è necessario fare le vostre proprietà virtuale. Ma questo è necessaria solo se si desidera che il soggetto sia in grado di carico pigri, leggere su di esso qui http://nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

Se non volete lazy loading è possibile disattivarla

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

Allora non avrete bisogno virtuale proprietà.

+0

In caso di utilizzo di Fluent NHibernate: Not.LazyLoad(); – leojh

2

è necessario dichiarare tutte le proprietà del prodotto come 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

Come il messaggio di errore dice, NHibernate richiede che le proprietà della classe entità contrassegnate come 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

funziona ora. ma "Prodotto" NON è stato salvato nel database. Creo manualmente una tabella "Prodotto" nel database? – user595234

+1

Puoi crearlo tu stesso o far funzionare NHibernate, ti suggerisco di leggere un po 'qui http://nhforge.org/wikis/howtonh/your-first-nhibernate-based-application.aspx – Jon

+0

che il tutorial non è di aiuto. – user595234