2012-05-02 18 views
7

Estoy aprendiendo NHibernate, pero no. Intuyo que los mensajes de error no son precisos.NHibernate extraño error

Por favor ayuda.

mensaje de error es

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

archivo de clase

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

mapeo

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

clase principal

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

     } 

Respuesta

5

Como dicen los demás - debe hacer sus propiedades virtual. Pero esto sólo es necesario si desea que su entidad a ser capaz de cargar perezoso, leer sobre él aquí http://nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

Si no quieres carga diferida se puede desactivar

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

Entonces usted no necesita virtuales propiedades.

+0

En caso de que esté usando Fluiber NHibernate: Not.LazyLoad(); – leojh

2

tiene que declarar todas sus propiedades del producto como 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

Como dice el mensaje de error, NHibernate requiere que las propiedades de clase de entidad serán marcados como 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

funciona ahora. pero "Producto" NO se guarda en la base de datos. ¿Creo manualmente una tabla de "Producto" en la base de datos? – user595234

+1

Puedes crearlo tú mismo o dejar que NHibernate lo haga, sugiero leer un poco aquí http://nhforge.org/wikis/howtonh/your-first-nhibernate-based-application.aspx – Jon

+0

ese tutorial no es de ayuda. – user595234