10

値オブジェクトとしてアドレスを含む個人エンティティがあります。

public Person()
{
    WithTable("Person");
    Id(x => x.Id);
    Component<Address>(x => x.Address, a =>
    {
        a.Map(x => x.Address1);
        a.Map(x => x.Address2);
        a.Map(x => x.Address3);
        a.Map(x => x.Town);
        a.Map(x => x.Postcode);
    });
}

NHibernateのドキュメントには、値オブジェクトのすべてのプロパティ(Address1、Address2など)がnullの場合、コンポーネント全体がnullとしてマップされる(つまり、Person.Addressがnullになる)と記載されています。これは、すべてのアドレスフィールドがnullの場合に問題を引き起こします。これは、私のページで(ASP MVCを実行している)次の理由で発生する可能性があるためです。

<%= Html.TextBoxFor((x => x.Address.Address1))%>

これはnull参照例外で壊れます。したがって、手動で行わずにデータベースからPersonをロードするときにすべてのフィールドが空の場合、Addressをnullではなく新しいAddress()オブジェクトとして設定するクリーンな方法を探しています。私は次のアイデアを割り引いた:

私の見解でヌルチェックを行う(yuk、恐ろしい)

データベースフィールドをnull許容不可にする(私はレガシーデータベースを扱っています)

誰かアイデアはありますか?

4

3 に答える 3

5

Jamesのアイデアのおかげで(彼の回答とコメントを参照)、PersonエンティティのAddressプロパティを次のように変更しました。

public virtual string Address { get; set; }

に:

private Address _address;
public virtual Address Address
{
    get { return _address ?? new Address(); }
    set { _address = value; }
}

これで私の問題は解決しました。動作し、NHibernateでも動作するようです。やった!

于 2009-03-26T09:17:40.307 に答える
2

マップされていないメソッド/プロパティアクセサーを作成する決定的な答えはありません。実際のアドレスがnullの場合、デフォルト/nullオブジェクトを返します。

public Address GetAddressOrDefault()
{
  return Address ?? new NullAddress();
}

または、最初と同様にAddress、ビューで使用するラッパーを作成します。

public class AddressViewData
{
  private Address address;

  public AddressViewData(Address address)
  {
    this.address = address ?? new NullAddress();
  }

  // expose all address properties as pass-throughs
  public string Street
  {
    get { return address.Street; }
  }
}
于 2009-03-25T19:50:56.377 に答える
0

場合によっては、NHibernate カスタム タイプを非常に簡単に作成できます。コンポーネントを null に設定する代わりに、null オブジェクトを返します。場合によってはこれを行いましたが、ヌルを忘れることができます。

複合ユーザー タイプの例

于 2010-12-02T15:31:14.143 に答える