7

NHibernateを学習していますが、失敗しました。エラーメッセージが正確ではないと感じています。

助けてください 。

エラーメッセージは

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

クラスファイル

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

マッピング

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

構成:

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

メインクラス

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

        }
4

3 に答える 3

6

他の人が言うように-あなたはあなたのプロパティを仮想にする必要があります。ただし、これが必要になるのは、エンティティが遅延読み込みできるようにする場合のみです。http://nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspxで確認してください。

遅延読み込みが必要ない場合は、無効にすることができます

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

そうすれば、仮想プロパティは必要ありません。

于 2012-05-02T19:00:46.350 に答える
3

エラー メッセージにあるように、NHibernate ではエンティティ クラスのプロパティが次のようにマークされている必要があります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; }
    }
}
于 2012-05-02T18:36:44.107 に答える
2

すべての Product プロパティを として宣言する必要があります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; }
于 2012-05-02T18:35:31.013 に答える