質問

私は値オブジェクトとしてアドレスを含む人の実体を持ってます:

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);
    });
}

これは、値のオブジェクト(アドレス1、アドレス2等)のすべてのプロパティがnullである場合、全体の成分(すなわちperson.addressではヌルであろう)ヌルとしてマッピングされること。NHibernateのドキュメントに述べ

:これは私に私のページで、私は(私はASP MVCをやっている)可能性がありますどこため、すべてのアドレスフィールドがNULLである場合に問題を与えています
<%= Html.TextBoxFor((x => x.Address.Address1))%>

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

私の見解ではnullチェックを行う(ユク、恐ろしい)

、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; }
  }
}

他のヒント

ジェームズのアイデアのおかげで(彼の答えとコメントを参照してください)私はから私のPersonエンティティのAddressプロパティを変更しました。

public virtual string Address { get; set; }

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

これは私の問題を解決した、それが動作し、NHibernateはで動作するようです。 YEY!

いくつかのケースでは、NHibernateのカスタムタイプを記述することは非常に簡単です。代わりにnullにコンポーネントを設定するのではなく、NULLオブジェクトを返します。私は、あなたがヌル忘れることができ、いくつかのケースでこれをやっています。

の例。rel="nofollow">

scroll top