Fluent Nhibernate保存子实体

本文关键字:实体 保存 Nhibernate Fluent | 更新日期: 2023-09-27 18:28:10

我有以下情况。一个包含"照片列表"集合的属性对象和"照片"对象可以引用一个或多个属性对象。所以我有这样的地图,我认为这是很好的

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

我的场景的数据流是用户以某种形式输入数据,每个属性最多可选择五个图像来创建数据。这些数据被发送到HttpPost控制器,该控制器接收PropertyViewModel newData和IEnumerable映像。如果模型状态正常,我打开会话和事务,将这些数据发送到域模型,然后将这些数据保存到数据库。除了没有保存图像之外,一切都还好吗?没有抛出错误,在调试模式下,图像会定期传递

以下是创建控制器和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中,我接收图像和其他数据,并尝试将它们添加到模型中。照片收集并保存。

 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;

Fluent Nhibernate保存子实体

您需要将Cascade.All()添加到PropertyMap中的HasMany映射中,而不是添加到PhotoMap中的References,因为您正在保存Property实例,并且需要级联其集合才能保存其子级。