2011-02-08 10 views
2

でオブジェクトを永続化する私の簡素化ドメインモデルは、このようなものになります。MVC2で検索を管理し、NHibernateの

public abstract class Entity<IdK> 
{ 
    public virtual IdK Code { get; protected set; } 
} 

public class Contact : Entity 
{ 
    public virtual string Name { get; set; } 
    public virtual Company Company { get; set; } 
} 

public class Company : Entity 
{ 
    public virtual string Name { get; set; } 
} 

を、私はのviewmodelを定義した:

public ContactViewModel() 
    { 
      public Guid Code { get; set; } 
      public int Version { get; set; } 

      public string Name { get; set; } 
      public string Company { get; set; } 

      public List<SelectListItem> Companies { get; set; } 
    } 

ビューで私の連絡先を管理します。ユーザーは自分のフォームを送信するとき、今すぐ

<%=Html.ListBoxFor(m => m.Company, (List<System.Web.Mvc.SelectListItem>)Model.Companies)%> 


は、私は、ユーザーが私はこのような私の見解でレンダリングされますSelectedListItemのリストを追加した企業のリストから選択することができるようにしたいので、私はそれを保存する前に私のモデルで私のビューモデルを再マップします。
Contactを入力し、ContactViewModel.CompanyのIDを使用して、Contactクラスのプロパティに関連付けるCompanyタイプのオブジェクトを作成します。
私はデータベースから会社全体を取得したくないので、IDを入力してください。 私の連絡先を維持すると、例外が発生します。"not-nullプロパティはnullまたは一時的なDomain.Contact.Company"を参照しています
MVC + Nhibernateでルックアップと永続性を管理する最適なソリューションは何ですか?
あなたの経験から何か提案がありますか?

答えて

2

残念ながら、NHibernateとルックアップでは、Companyオブジェクトの新しいインスタンスにIDプロパティを割り当て、そのCompanyオブジェクトをContactに割り当てることはできません。

一般的に、私はどうなるのかは、連絡先を保存するときに、あなたが会社情報を変更することができないと仮定して、私のリポジトリ内にあるこのようなものです:

public Contact Save(Contact contact) 
{ 
    if(contact.Company.Id > 0) 
     contact.Company = Session.Load<Company>(contact.Company.Id); 

    Session.SaveOrUpdate(contact); 
} 

私は一般的に、これはあなたがロジックをカプセル化することができます見つけますまた、1つのセッションでうまく包み込むことができます。このようにたSession.loadを使用して

は、あなたがこれをしない場合は、何が本質的NHibernateのに言っていることはあなたが持っている会社のオブジェクトを持っているということですhere

を説明するように、データベースを打つ回避しますIDを割り当てて、すべてのプロパティをNullまたは空の文字列値などに設定して保存したい場合は、必要なものではありません。

は、別の方法としては、次のようになります保存、特定のドメインオブジェクトを作成することができます。

データベース内の連絡先テーブルに直接マップ
public abstract class Entity<IdK> 
{ 
    public virtual IdK Code { get; protected set; } 
} 

public class SavableContact : Entity 
{ 
    public virtual string Name { get; set; } 
    public virtual IdK CompanyId { get; set; } 
} 

あなたは、このエンティティを保存するとき、あなたは文字通りたCompanyIdをバックにマッピングできるように、あなたのビューモデルからNHibernateは、その値を元に戻すだけで、会社のオブジェクトについては気にしません。

あなたに最適なものを見つけ出すことができます。論理的な余分なビットがドメインモデルを簡素化するのに役立つので、私は個人的に最初のオプションを好みますが、パブリックAPIを作成して公開する場合は、2番目の方法が理にかなっています。

+0

ありがとうlomaxx。私は最初の選択肢に行くと思う。それはあなたのルックアップを管理する方法ですか? – LeftyX

+0

はい、私は彼の最初の方法を使用します。私は偶然にいくつかの読書をしていましたが、この正確な問題を説明する記事へのリンクを追加しました。これは、昨晩行ったいくつかのテストと組み合わせれば、データベースヒットを避けるための正しい方法だということを示唆しています。 – lomaxx

+0

私はあなたのソリューションを試してみました。ご協力いただきありがとうございます。 – LeftyX

関連する問題