2009-06-24 14 views
1

Fluent NHibernateマッピングに問題があります。問題を回避するためにマッピングをどのように設定する必要があるのか​​よく分かりません。Fluent NHibernate Mapping - Save Childオブジェクト

私はビジネスオブジェクト(文字通り「ビジネス」)とレビューオブジェクトを持っています。各ビジネスは、UIのページに作成された複数のレビューを持つことができます。次のようなビジネスは、レビューのプロパティです:

public class Business 
{ 
    public virtual int BusinessId {get;set;} 
    public virtual DateTime LastModified {get;set;} 
    public virtual IList<Review> Reviews {get;set;} 

    [... more removed for brevity ...] 

} 

public class Review 
{ 
    public virtual int ReviewId {get;set;} 
    public virtual string ReviewText {get;set;} 
    public virtual Business Business {get;set;} 

    [... more removed for brevity ...] 

} 

次のように私のマッピングは、次のとおりです。

public class ReviewMap : ClassMap<Review> 
{ 
    public ReviewMap() 
    { 
     WithTable("Reviews"); 
     Id(x => x.ReviewId).TheColumnNameIs("ReviewId").GeneratedBy.Identity(); 

     References(x => x.Business).TheColumnNameIs("BusinessId"); 

     Map(x => x.ReviewText); 

     [... and so on...] 
} 


public class BusinessMap : ClassMap<Business> 
{ 
    public BusinessMap() 
    { 
     WithTable("Businesses"); 

     Id(x => x.BusinessId).TheColumnNameIs("BusinessId").GeneratedBy.Identity(); 

     Map(x => x.Name).TheColumnNameIs("BusinessName"); 
     Map(x => x.LastModified, "LastModifiedOn"); 

     HasMany<Review>(x => x.Reviews) 
      .Inverse() 
      .LazyLoad(); 

     [... more removed for brevity ...] 

    } 
} 

リポジトリのコードは、私が割り当て、コードで

public void Save(T entity) 
    { 
     using (ISession session = GetSession()) 
     using (ITransaction tx = session.BeginTransaction()) 
     { 
      session.SaveOrUpdate(entity); 
      tx.Commit(); 
     } 
    } 

ですプロパティをReviewオブジェクトに追加し、リポジトリのSaveメソッドを呼び出します。

問題は、ビジネス自体を更新していないため、保存されるとは思わないということです。私が望むのはレビュー保存です。しかし、コードではビジネスを保存しようとしています。私は "LastModified"プロパティを設定していないので、私は賞賛を受けています。また、私はビジネスではなくREVIEWを保存しています。

これを可能にするためにマッピングをどのように設定する必要がありますか?

答えて

0

これは問題でした。ビジネスのLastModifiedプロパティは、実際のビジネスオブジェクトに実際には設定されていませんでした。データベースはこのプロパティに対してNULLを許可していました。

私はレビューを保存しようとしたときに、ビジネスを保存しようとしました。おそらく、データベースオブジェクトにLastModifiedの値(null)はありませんでしたが、LastModified DateTimeであり、その値はDateTime.MinValueです。

データベース内のビジネステーブルを更新して、LastModifiedがNULLにならないようにすると、正常に動作します。

これは残念ながら、私が作業していたデータがこの状態になっていないということです。

+0

これがあなたの質問に答えるならば、答えとしてこれを受け入れるべきです。 – ddc0660

+0

申し訳ありませんが、私は自分の答えを受け入れるために待つ必要があったと正直言って...戻ってそれを修正することを忘れてしまった! – reallyJim

0

問題は、ビジネスとレビューの間の重要なキー要件になる可能性があります。ビジネス(親)は、通常、レビュー(子)の前に保存する必要があります。

これは役に立ちませんでしたあなたのビジネスオブジェクトのマッピングを含めることができますか?

+0

まあ、ビジネスはすでに存在しています - とにかく、私はIDを持っていれば、それはレビューの独立性の一種だから、それを保存することは期待していません。私が意味することはこれです:なぜ私は変化していないオブジェクトを保存したいのですか? – reallyJim

+0

ビジネスが保存されている場合、LastModifiedプロパティが設定されていないというエラーがどのように表示されますか? Review.Businessプロパティ値をどのように割り当てていますか? –

0

私はまだコメントできませんので、ここに投稿します。

LastModified列をnullにしたい場合は、対応するプロパティーをDateTimeではなくDateTime?にする必要があります。

+0

Daveが正しいのは、あなたの全面的な問題がDateTimeをnullにする必要がある場合だけです...あなたはDateTimeを使用していますか?DateTimeをDateTime.Minに設定するのではなく、 –