1

SharpArchitecture で Npgsql を使用しているときに助けてくれる人はいますか?私はイライラしています。Postgresql 8.4、Npgsql 2.0.11、SharpArchitecture 2.0.0.0、および Visual Studio 2010 を使用しました。

「success」という名前の私のサンプル プロジェクト。

1)すべてのプロジェクトでNpgsqlドライバーを参照し、NHibernate.configを次のように設定しましたが、問題はないと感じました:

<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
  <property name="connection.driver_class">NHibernate.Driver.NpgsqlDriver</property>
  <property name="dialect">NHibernate.Dialect.PostgreSQLDialect</property>
  <property name="connection.connection_string">
    Server=localhost;Database=***;Encoding=UNICODE;User ID=***;Password=***;
  </property>

2)データベースドメインファイルは次のとおりです。テーブル名はstudent(sno、sname、sage)で、snoはPKで、文字列を入力します:

//student.cs
using System.Collections.Generic;
using SharpArch.Domain.DomainModel; 
namespace success.Domain {
public class student : Entity
{
        public student() { }
        public virtual string sno { get; set; }
        public virtual System.Nullable<int> sage { get; set; }
        public virtual string sname { get; set; }
    }
}

//studentMap.cs
using FluentNHibernate.Automapping.Alterations;
namespace success.Domain {
public class studentMap : IAutoMappingOverride<student>
{
    public void Override(FluentNHibernate.Automapping.AutoMapping<student> mapping)
    {
        mapping. Table("student");
        mapping.LazyLoad();
        mapping.Id(x => x.sno).GeneratedBy.Assigned().Column("sno"); 
   //I don't used Id but sno as the PK, and sno is typed string.
        mapping.Map(x => x.sage).Column("sage");
        mapping.Map(x => x.sname).Column("sname");
    }
}
}

3) Id 以外の列テーブルを使用するために、デフォルトの MyEntity1.cs を削除し、AutoPersistenceModelGenerator.cs を次のように変更しました。

...
public AutoPersistenceModel Generate()
    {
        var mappings = AutoMap.AssemblyOf<studentMap>(new AutomappingConfiguration())
            .UseOverridesFromAssemblyOf<studentMap>()    //alter AutoMapping Assembly
            .OverrideAll(map => { map.IgnoreProperty("Id"); })  // ignore id property, and the program recognize the "sno" as the PK, test OK
...

4) Tasks プロジェクトで、"sno" でレコードを取得するために、インターフェイス IStudentRepository.cs とクラス StudentRepository.cs を作成し、NHibernateRepository を変更します。

//IStudentRepository.cs 
using success.Domain;
using SharpArch.NHibernate.Contracts.Repositories;
namespace success.Tasks.IRepository
{
public  interface IStudentRepository:INHibernateRepository<student>
{
    student GetStudentFromSno(string sno);
}
}

//StudentRepository.cs 
using SharpArch.NHibernate;
using success.Domain;
using success.Tasks.IRepository;
using NHibernate;
using NHibernate.Criterion;
namespace success.Tasks.Repository
{
public class StudentRepository:NHibernateRepository<student>,IStudentRepository
{
    public student GetStudentFromSno(string sno)    //define a new method to fatch record by sno
    {
        ICriteria criteria = Session.CreateCriteria<student>()     
            .Add(Expression.Eq("sno", sno));     
        return criteria.UniqueResult() as student;
    }
}
}

5) MVC プロジェクトで、StudentController.cs を作成し、NHibernateRepository の代わりに StudentRepository を使用します。主要なコードは次のとおりです。

 ...
 public ActionResult Index()
    {
        var students = this.studentRepository.GetAll();
        return View(students);
    }

    private readonly StudentRepository studentRepository;

    public StudentsController(StudentRepository studentRepository)
    {
        this.studentRepository = studentRepository;
    }

    [Transaction]
    [HttpGet]
    public ActionResult CreateOrUpdate(string sno)
    {
        student s = studentRepository.GetStudentFromSno(sno);
        return View(s);
    }

    [Transaction]
    [ValidateAntiForgeryToken]
    [HttpPost]
    public ActionResult CreateOrUpdate(student s)
    {
        if (ModelState.IsValid && s.IsValid())
        {
            studentRepository.SaveOrUpdate(s);
            return this.RedirectToAction("Index");
        }
        return View(s);
    }

    [Transaction]
    [ValidateAntiForgeryToken]
    [HttpPost]
    public ActionResult Delete(string sno)
    {
        var s = studentRepository.GetStudentFromSno(sno);
        if (s == null)
            return HttpNotFound();
        studentRepository.Delete(s);
        return this.RedirectToAction("Index");
    }
...

6) ビューを作成し、今までは問題ありませんでしたが、最後のステップで、プロジェクトに次のようなエラーが表示されます。ただし、プロジェクトを SQL Server 2005 プラットフォームに変更する場合は問題ありません。Global.asax.cs にエラーが表示されました。

...
private void InitialiseNHibernateSessions()
{
NHibernateSession.ConfigurationCache = new NHibernateConfigurationFileCache();
//the follow line codes make error when using Npgsql, but no error when using SQL Server 2005 
NHibernateSession.Init(
this.webSessionStorage,
new[] { Server.MapPath("~/bin/success.Infrastructure.dll") },
new AutoPersistenceModelGenerator().Generate(),
Server.MapPath("~/NHibernate.config"));
}
...

エラーの詳細は次のとおりです。

System.NotSupportedException was unhandled by user code
  Message=Specified method is not supported.
  Source=Npgsql
  StackTrace:
   at Npgsql.NpgsqlConnection.GetSchema(String collectionName, String[] restrictions) in C:\projects\Npgsql2\src\Npgsql\NpgsqlConnection.cs:line 970
   at Npgsql.NpgsqlConnection.GetSchema(String collectionName) in C:\projects\Npgsql2\src\Npgsql\NpgsqlConnection.cs:line 946
   at NHibernate.Dialect.Schema.AbstractDataBaseSchema.GetReservedWords()
   at NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.GetReservedWords(Dialect dialect, IConnectionHelper connectionHelper)
   at NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.Update(ISessionFactory sessionFactory)
   at NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners)
  InnerException: 

私を助けてください!最終的な努力が足りないために、成功には至らないと感じました。私はイライラしています!

4

1 に答える 1

1

これを見ましか?

hbm2ddl.keywords「 」、「none」を追加してNhibernate.config、問題が解決するかどうかを確認してください。

于 2012-05-04T04:37:07.983 に答える