给定以下类结构
public class OrderHeader
{
public virtual Guid Id { get; set; }
public virtual IList<IOrderDetail> OrderDetails { get; set; }
...
}
public Interface IOrderDetail
{
Guid Id { get; set; }
...
}
public class OrderDetail : IOrderDetail
{
public virtual Guid Id { get; set; }
...
}
使用以下 NHibernate 代码文件映射。
public class OrderHeaderMap : ClassMapping<OrderHeader>
{
public OrderHeaderMap()
{
Id(item => item.Id,
map =>
{
map.Generator(Generators.Guid);
});
Bag(item => item.OrderDetails,
cm =>
{
cm.Key(k =>
{
k.Column("IOrderDetailsId");
k.NotNullable(true);
});
cm.Inverse(true);
cm.Cascade(Cascade.All | Cascade.DeleteOrphans);
cm.Lazy(CollectionLazy.NoLazy);
},
r =>
{
r.OneToMany(rm =>
{
});
});
}
public class IOrderDetailsMap : ClassMapping<IScrewlineExpressionBlock>
{
public IOrderDetailsMap()
{
Id(item => item.Id,
map =>
{
map.Generator(Generators.Guid);
});
}
public class OrderDetailsMap : JoinedSubclassMapping<OrderDetails>
{
public OrderDetailsMap()
{
Key(k =>
{
k.Column(col =>
{
col.Name(typeof(IOrderDetails).Name + "Id");
});
});
}
}
}
我遇到的问题是未设置映射详细信息表中标题 Id 字段的 IOrderDetailsId 字段。
用于写入记录的代码是
using (DAO dao = new DAO())
{
foreach (IScrewlineConditionExpression entry in modifiedValues)
{
IScrewlineConditionExpression header;
if (entry.Id.Equals(Guid.Empty) || (header = dao.GetById(entry.Id)) == null)
{
Guid id = dao.Create(entry);
header = dao.GetById(id);
}
dao.Update(header);
}
}
...
public PK Create(T newItem)
{
return (PK) Session.Save(newItem);
}
public T Update(T updatedItem)
{
T result = Session.Merge(updatedItem);
Session.Flush();
return result;
}
因此,父记录的 ID 是否应该自动应用于更新/合并的详细记录,或者是我在更新之前必须做的事情。我会认为这是一个困难的提议,因为详细记录上没有可访问的属性要更新。
我更新的方式有什么问题,或者信息的映射方式阻止了 ID 字段的更新?
任何查询都无法找到详细记录,因为生成的 SQL 依赖于 IOrderDetailsId 字段来定位详细记录。