6

私はNhibernate.Linq 1.0とgithubのマスターからダウンロードしたFluentNhibernateの最新バージョンでNhibernate 2.1.2.4000 GAを使用しています。

いくつかのテストを行っていますが、linq クエリによって取得されたエンティティを削除しようとすると、次のエラーが発生します。

永続化機能なし: NHibernate.Linq.Query`1[[Employees.Core.Entities.Employee, Employees.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]

他のすべての操作 (挿入、更新、および選択) は正常に見えます。

私のエンティティクラス:

public class Employee
{
    public Employee()
    {
    }

    public virtual Int32 Id { get; private set; }
    public virtual String Name { get; set; }    

    public virtual String SayHello()
    {
        return String.Format("'Hello World!', said {0}.", Name);
    }
}

マッピング クラス:

public class EmployeeMap : ClassMap<Employee>
{
    public EmployeeMap()
    {
        Id(x => x.Id);
        Map(x => x.Name)
            .Not.Nullable()
            .Length(50);
    }
}

構成:

Assembly mappingsAssemly = Assembly.GetExecutingAssembly();

return Fluently.Configure()
    .Database( MsSqlConfiguration.MsSql2008
                    .ConnectionString(connectionString)
                    .ProxyFactoryFactory(typeof(ProxyFactoryFactory))
                    .ShowSql())                            
    .Mappings( m => m.FluentMappings.AddFromAssembly(mappingsAssemly))
    .BuildSessionFactory();

そして、動作しないコード:

public void RemoveAll()
{
    var q = from employee in _session.Linq<Employee>()
            select employee;

    foreach (var employee in q.ToList())
    {
        _session.Delete(q);
    }
}

何かご意見は?

4

3 に答える 3

5

私たちは皆それを逃しました!

申し訳ありませんが、すべての助けに感謝しますが、私はただ考えました.

RemoveAll() メソッドに注意を払うと、エンティティではなく IQueriable である「q」オブジェクトを「employee」を渡す代わりに削除しようとしていることがわかります。注意不足でした。

正しいコードは次のようになります。

        public void RemoveAll()
        {
            var q = _session.Linq() の従業員から
                    従業員を選択します。

            var p = q.ToList();

            foreach (p の var 従業員)
            {
                _session.Delete(従業員);
            }
        }
于 2010-01-27T20:46:15.180 に答える
2

FNH ( Assembly.GetExecutingAssembly()) に提供しているアセンブリが、実際にマッピングを含むものであると確信していますか?

Mappingsメソッドを含めるように呼び出しを変更しますExportTo。これにより、FNH が検出したすべてのマッピングが指定されたフォルダーにエクスポートされます。そのフォルダの内容を調べて、すべてのマッピングがそこにあるかどうかを確認してください。もしそうなら、それはFNHの問題ではなく、Linqプロバイダーの問題である可能性があります(Michaelが言ったように)。

Mappings(
  m => m.FluentMappings
          .AddFromAssembly(mappingsAssemly)
          .ExportTo(@"C:\"));

確認できるもう 1 つのことは、NH が実際に使用している NHibernate 構成インスタンスです。これを行うには、BuildConfiguration代わりに使用BuildSessionFactoryして結果を調べます。マッピングされたすべてのClassMappingsエンティティを含むコレクション (またはそのバリエーション) があります。

問題がないように見える場合は、代わりに Criteria API または HQL を使用してクエリを作成し、問題が解決するかどうかを確認してください (その場合、linq プロバイダーであることがほぼ確実です)。

于 2010-01-23T19:21:49.580 に答える
1

Linqプロバイダーのバグである可能性があります。新しい/異なるLinqプロバイダーを含む最新のNHibernateトランクに対して問題を再現してみることをお勧めします。あるいは、方程式からFluent NHibernateを(正常に)削除した場合、おそらく(比較的簡単に)Linqプロバイダーに対してテストケース/バグレポートを送信できます。

于 2010-01-23T11:29:50.587 に答える