给出以下类结构
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字段来查找详细记录。