NHibernate を使用する ASP.NET MVC アプリケーションに有線の問題があります。
IsLeaderBanker(IbEmployee banker)
ドメイン モデルで名前が付けられた仮想メソッドがあります。実装は次のようになります。
public virtual bool IsLeaderBanker(IbEmployee banker)
{
return GetLeaderBankers().Any(lb => lb.Id == banker.Id);
}
シンプルでスムーズです。ただし、Nhibernate は SessionStorage を初期化するときに例外をスローします。
The entity '<>c__DisplayClass9' doesn't have an Id mapped. Use the Id method to map your identity property. For example: Id(x => x.Id).
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: FluentNHibernate.Visitors.ValidationException: The entity '<>c__DisplayClass9' doesn't have an Id mapped. Use the Id method to map your identity property. For example: Id(x => x.Id).
Source Error:
Line 144: storage = new WebSessionStorage(this);
Line 145: NHibernateInitializer.Instance().InitializeNHibernateOnce(
Line 146: () => NHibernateSession.Init(storage,
Line 147: new[] { Server.MapPath(@"~/bin/IB.Oss.Dal") },
Line 148: AutoPersistenceModelGenerator.Generate(
かなり多くの推測とテストを試みた後、 LINQ Anyメソッドがクラッシュしたことがわかりました。つまり、次のように書き直すと、次のようになります。
public virtual bool IsLeaderBanker(IbEmployee banker)
{
var result = GetLeaderBankers();
foreach (var b in result)
{
if (b.Id == banker.Id)
{
return true;
}
}
return false;
}
すべてが機能します。これは同じロジックであり、Reshaper はそれを LINQ に変更することを提案しています。Any メソッドが NHibernate を壊すのはなぜですか? Where と Select を何度も使用していますが、すべて正常に動作します。
私のアプリケーションでは、Nhibernate のバージョンは 3.3.2 です。