2012-03-19 107 views
2

我有以下情況。一個擁有照片列表集合和Photo對象的屬性對象可以引用一個或多個屬性對象。 所以我有這樣的映射,我認爲這是我的方案的精細流利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(); 
} 

數據流 用戶以某種形式進入數據和選擇最多五個鏡像每一個屬性創建數據。 該數據發送到接收PropertyViewModel newData和IEnumerable圖像的HttpPost控制器。如果modelstate沒問題,我打開會話和事務,並將此數據發送到域模型,並將此數據保存到數據庫。 一切正常,除了圖像沒有保存?沒有錯誤拋出,在調試模式下圖像通過regulary。

這裏是代碼創建控制器和內部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); 
    } 
} 

而且在內部視圖模型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

您需要的Cascade.All()添加到您的HasMany映射PropertyMap,不要在PhotoMapReferences,因爲要保存的Property實例,並需要級聯其藏品也挽救其孩子。

+0

好的,現在我的房產地圖有 HasMany(x => x.Photos).KeyColumn(「Id」)。Cascade.All(); 和PhotoMap有 引用(x => x.Property).Column(「PhotoId」); 現在保存我收到 無效的列名'PhotoId'。 – BobRock 2012-03-19 10:39:50

+0

@ user313378:你的'Photo'表中沒有'PhotoId'列。您需要在'Photo'中指定引用父表'Property'的列。最有可能的是,這個列被稱爲'PropertyId'。 – 2012-03-19 10:42:39

+0

不錯的工作人,謝謝你,愛stackoverflow。 – BobRock 2012-03-19 10:48:53