4

NHibernateを介して取得している例外に戸惑い、イライラしています。この投稿の長さについてお詫び申し上げますが、問題を十分に説明するために適切なレベルの詳細を含めて、助けを得るようにしました。

事実は次のとおりです。

  • 型でもあるプロパティをPerson含むクラスがあります。これをFNHの「リファレンス」としてマッピングします。BillingManagerPerson
  • タイプであるExpenseReportプロパティを含むクラスがあります。これをFNHの「リファレンス」としてマッピングします。SubmittedByPerson
  • タイプであるプロパティをBillableTime含むクラスがあります。これをFNHの「リファレンス」としてマッピングします。PersonPerson
  • PersonExpenseReportタイプ(プロパティExpenseReports)のコレクション(IList)が含まれています
  • PersonBilledTimeタイプ(プロパティ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; }             
}
4

1 に答える 1

2

次の行で問題が解決するはずですが、なぜそれが起こっているのか正確にはわかりません。暇があれば調べます。

HasMany(p => p.Time).Cascade.AllDeleteOrphan().KeyColumn("Person_Id");
于 2011-10-07T12:49:24.980 に答える