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