我有一个映射ID的问题。 是实体的结构如下:
public abstract class Entity<TEntity, TId>
where TEntity : Entity<TEntity, TId>
{
public virtual TId Id { get; protected set; }
public override bool Equals(object obj)...
...
}
public class EntityA<EntityA, long> : Entity<EntityA, long>
{
public virtual EntityB B { get; private set; }
/* ... */
}
public class EntityB<EntityA, long> : Entity<EntityB, long>
{
/* ... */
}
在我的模型中,每个EntityA必须只包含一个EntityB,并且存在在那里是一个EntityA的一部分,每一个EntityB。 这是一个常见的一种一对一的关系 。
现在,映射:
public class EntityAMap : ClassMap<EntityA>
{
public EntityAMap()
{
Id(x => x.Id);
HasOne(x => x.B)
.Cascade.All();
/* ... */
}
}
public class EntityBMap : ClassMap<EntityB>
{
public EntityBMap()
{
Id(x => x.Id)
.GeneratedBy.Foreign("Id");
/* ... */
}
}
然后,我创建一个EntityA,它通过将自身创建EntityB。 然后,当我将它保存
var entityA = EntityAFactory.CreateNewValidEntityA();
session.SaveOrUpdate(entityA);
NHibernate的抛出一个异常,“无法解析属性:ID”。
然而,我的日志显示,一个EntityA被“插入”到数据库,并通过调试,我可以看到EntityA.Id归因值(即NHibernate的工作做得很好保存entityA,通过检索数据库和生成的ID相应地设置entityA.Id属性)。
然而,没有entityB创建(空数据库和日志显示什么)。 因此,它看起来对我来说,NHibernate的有问题,访问该属性,节约EntityB时,通过“GeneratedBy.Foreign(” ID“)”的定义。 也许是因为属性“ID”不直接EntityA的属性,但是从EntityBase,但我就是这样做看起来是正确的给我。
问题出在哪儿? 我该如何解决呢?
谢谢!
编辑:在这里,我表现出一定的堆栈跟踪,如果可能的帮助。 正如你所看到的,它没有级联,才SaveOrUpdate的其他实体。
at NHibernate.Tuple.Entity.EntityMetamodel.GetPropertyIndex(String propertyName)
at NHibernate.Tuple.Entity.AbstractEntityTuplizer.GetPropertyValue(Object entity, String propertyPath)
at NHibernate.Persister.Entity.AbstractEntityPersister.GetPropertyValue(Object obj, String propertyName, EntityMode entityMode)
at NHibernate.Id.ForeignGenerator.Generate(ISessionImplementor sessionImplementor, Object obj)
...
at NHibernate.Impl.SessionImpl.SaveOrUpdate(String entityName, Object obj)
at NHibernate.Engine.CascadingAction.SaveUpdateCascadingAction.Cascade(IEventSource session, Object child, String entityName, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeToOne(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeAssociation(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeProperty(Object child, IType type, CascadeStyle style, Object anything, Boolean isCascadeDeleteEnabled)
at NHibernate.Engine.Cascade.CascadeOn(IEntityPersister persister, Object parent, Object anything)
...
at NHibernate.Impl.SessionImpl.SaveOrUpdate(Object obj)
at myproject...