2012-03-19 13 views
2

を保存します。写真リストコレクションを保持する1つのプロパティオブジェクトと、写真オブジェクトは、1つ以上のプロパティオブジェクトを参照することができます。 だから私は、私は私のシナリオの 流暢NHibernateのは、私は次のような状況を抱えている子実体

public PropertyMap() 
{ 
    Table("Property"); 
    Id(x => x.Id).GeneratedBy.Identity(); 
    Map(x => x.Title).Length(255).Not.Nullable(); 
    HasMany(x => x.Photos).KeyColumn("Id"); 
} 

public PhotoMap() 
{ 
    Table("Photo"); 
    Id(x => x.Id).GeneratedBy.Identity(); 
    Map(x => x.Version); 
    Map(x => x.ImageData).CustomSqlType("VARBINARY(MAX)").Length(160000); 
    Map(x => x.ImageMimeType); 
    References(x => x.Property) 
     .Column('PhotoId') 
     .Cascade.All(); 
} 

細かいデータの流れだと思います。このようなマッピングは、 ユーザーが何らかの形でデータを入力されており、一つの特性ごとに5枚の画像まで選択してデータを作成します。データはHttpPost PropertyViewModelあるnewDataを受信し、コントローラ、およびIEnumerableをイメージに送信されること 。 modelstateが正常であれば、私はセッションとトランザクションを開き、このデータをドメインモデルに送信し、このデータをdbに保存します。画像が保存されていない以外 すべてが、大丈夫ですか?デバッグモードでは、エラーはスローされず、画像は定期的に渡されます。

は、ここでのコードは、コントローラを作成し、PropertyViewModel ToDomainModel()メソッド

[HttpPost] 
public ActionResult Create(PropertyViewModel newData, IEnumerable<HttpPostedFileBase> images)   
{ 
    if (ModelState.IsValid) 
    { 
     using (/// open session) 
     { 
      using (// using transaction) 
      { 
      MyDomain.Property model = new MyDomain.Property(); 
      newData.ToDomainModel(model, images); 

      tx.Commit(); 
      session.Save(model); 
      } 
     } 
     return RedirectToAction("Index"); 
    } 
    else 
    { 
     return View(newData); 
    } 
} 

内側とViewModelに内部ToDomainModelに、私は他のデータと一緒に画像を受信し、それらをmodel.Photosコレクションに追加して保存しようです。

public void ToDomainModel(Property x, IEnumerable<HttpPostedFileBase> Images) 
    { 
     x.Id = Id;    

     List<Photo> Photos = new List<Photo>(); 
     foreach (var image in Images) 
     { 
      if (image != null && image.ContentLength > 0) 
      { 
       Photo p = new Photo(); 
       p.Property = x; 
       p.ImageMimeType = image.ContentType; 
       p.ImageData = new byte[image.ContentLength]; 
       image.InputStream.Read(p.ImageData, 0, image.ContentLength); 

       Photos.Add(p); 
      } 
     } 
     x.Photos = Photos; 

答えて

4

あなたはPropertyインスタンスを保存し、またその子供たちを救うために、そのコレクションをカスケード接続する必要があるので、ないPhotoMapReferencesに、PropertyMapであなたのHasManyマッピングにCascade.All()を追加する必要があります。

+0

OK、今私のpropertyMapが hasManyのを持っている(X => x.Photos).KeyColumn( "ID")Cascade.All(); PhotoMapには があります。参照(x => x.Property).Column( "PhotoId"); は今の保存に私は 無効な列名「PHOTOID」を取得しています。 – BobRock

+0

user313378 @:何列 'PhotoId'は、あなたの' Photo'テーブルではありません。親テーブル 'Property'を参照する' Photo'に列を指定する必要があります。おそらく、この列は「PropertyId」と呼ばれます。 –

+0

素敵な仕事の男、ありがとう、愛stackoverflow。 – BobRock

関連する問題