Error in NHibernate

I am learning NHibernate but could not. I feel the error messages are inaccurate.

Please, help.

error message

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

Class file

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

display

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

configurations:

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

main class

 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); } } 
+7
source share
3 answers

As others say, you must make your properties virtual. But this is only necessary if you want your organization to be lazy, read here. http://nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

If you don’t need lazy loading, you can disable it

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

Then you do not need virtual properties.

+5
source

As the error message says, NHibernate requires that the properties of the entity class be marked 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; } } } 
+3
source

You need to declare all of your product properties as 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; } 
+2
source

All Articles