NHibernateを介して取得している例外に戸惑い、イライラしています。この投稿の長さについてお詫び申し上げますが、問題を十分に説明するために適切なレベルの詳細を含めて、助けを得るようにしました。
事実は次のとおりです。
- 型でもあるプロパティを
Person
含むクラスがあります。これをFNHの「リファレンス」としてマッピングします。BillingManager
Person
- タイプである
ExpenseReport
プロパティを含むクラスがあります。これをFNHの「リファレンス」としてマッピングします。SubmittedBy
Person
- タイプであるプロパティを
BillableTime
含むクラスがあります。これをFNHの「リファレンス」としてマッピングします。Person
Person
Person
ExpenseReport
タイプ(プロパティExpenseReports
)のコレクション(IList)が含まれていますPerson
BilledTime
タイプ(プロパティTime
)のコレクション(IList)が含まれています
(投稿の下部にあるクラスとマッピングを参照してください。)
IList<BilledTime> Time
コレクションをに追加するまでは、すべてがクールでしたPerson
。ここで、にアクセスしようとすると_person.Time
、例外が発生します。
コード:
// Get billable hours
if (_person.Time == null ||
_person.Time.Count(x => x.Project.ProjectId == project.ProjectId) == 0)
{
// No billable time for this project
billableHours = Enumerable.Repeat(0F, 14).ToArray();
}
例外:
could not initialize a collection:
[MyApp.Business.Person.Time#211d3567-6e20-4220-a15c-74f8784fe47a]
[SQL: SELECT
time0_.BillingManager_id as BillingM8_1_,
time0_.Id as Id1_,
time0_.Id as Id1_0_,
time0_.ReadOnly as ReadOnly1_0_,
time0_.DailyHours as DailyHours1_0_,
time0_.Week_id as Week4_1_0_,
time0_.Person_id as Person5_1_0_,
time0_.Project_id as Project6_1_0_,
time0_.Invoice_id as Invoice7_1_0_
FROM [BillableTime] time0_
WHERE time0_.BillingManager_id=?]
確かに、これは無効な列名であり、テーブルBillingManager_id
には存在しません。BillableTime
ただし、NHBがこのSQLを作成した理由がわかりません...私には意味がありません。解決策を検索するときに、この「無効な列名」の例外をよく目にしましたが、何も機能していないようです。さらに紛らわしい:のようBilledTime
に、ExpenseReport
タイプにはへの参照も含まれており、Person
完全に機能します。
私が理解できたのは、Personマッピング(References(p => p.BillingManager)
)からBillingManager参照を削除すると、例外がなくなり、動作しているように見えることです(BillableTimeに関しては、もちろんBillingManagerの永続性が失われます)。Person.BillingManager
プロパティ自体がへの参照であるため、「自己参照」の問題があるようPerson
です。
ここで何が起こっているのか分かりますか?私は途方に暮れています...
ありがとう。
===クラスとマッピング===
public class Person
{
public virtual string LastName { get; set; }
public virtual string FirstName { get; set; }
public virtual Person BillingManager { get; set; }
public virtual IList<ExpenseReport> ExpenseReports { get; set; }
public virtual IList<BillableTime> Time { get; set; }
}
public class PersonMapping : ClassMap<Person>
{
public PersonMapping()
{
Id(p => p.UserId).GeneratedBy.Assigned();
Map(p => p.LastName).Not.Nullable();
Map(p => p.FirstName).Not.Nullable();
References(p => p.BillingManager);
HasMany(p => p.ExpenseReports).Cascade.AllDeleteOrphan();
HasMany(p => p.Time).Cascade.AllDeleteOrphan();
}
}
public class BillableTime
{
public virtual int Id { get; private set; }
public virtual Week Week { get; set; }
public virtual Person Person { get; set; }
public virtual Project Project { get; set; }
public virtual float[] DailyHours { get; set; }
public virtual Invoice Invoice { get; set; }
public virtual bool ReadOnly { get; set; }
}
public class BillableTimeMapping : ClassMap<BillableTime>
{
public BillableTimeMapping()
{
Id(x => x.Id);
References(x => x.Week);
References(x => x.Person);
References(x => x.Project);
References(x => x.Invoice);
Map(x => x.ReadOnly).Not.Nullable().Default("0");
Map(x => x.DailyHours).Length(28);
}
}
public class ExpenseReport
{
public virtual long Id { get; set; }
public virtual Person SubmittedBy { get; set; }
}