NHibernate-无法保存子实体

NHibernate-无法保存子实体,nhibernate,fluent-nhibernate-mapping,Nhibernate,Fluent Nhibernate Mapping,这应该是一个简单的1-N关系,但是我无法保存子项,因为NHibernate在子项的insert语句中使用null作为值 public class Event { public virtual string Id { get; set; } public virtual string Name { get; set; } public virtual IList<EventParameter> Parameters{ get; set; } pub

这应该是一个简单的1-N关系,但是我无法保存子项,因为NHibernate在子项的insert语句中使用null作为值

 public class Event
 {
  public virtual string Id { get; set; }
  public virtual string Name { get; set; }        
  public virtual IList<EventParameter> Parameters{ get; set; }

  public Event() { Parameters = new List<EventParameter>(); }
 }

[Serializable]
public class EventParameter : Parameter
{
  public virtual Event Event { get; set; }
  public virtual string ComparisonMethod { get; set; }
  public override bool Equals(object obj) {}
  public override int GetHashCode() {}
}
在此之前,我得到以下警告:无法确定实体是暂时的还是分离的;查询数据库。在会话中使用显式Save()或Update()可防止出现这种情况


我确实在事务中使用Save()。你知道为什么会这样吗?

这里的解决方案非常简单。我们必须使用
inverse=“true”
映射:

HasMany<EventParameter>(x => x.Children)
        .KeyColumns.Add("...")
        .Inverse()
        .Cascade.All();
请注意此项了解更多详细信息


mmmm…我在代码中不做这种循环引用。我现在就试试这个。谢谢你的建议。这个“循环参考”是ORM的核心。对象关系映射。我们绘制了关系图。我发现很多争论都在挑战这一点,但根据我的经验。。。如果您不想让业务域模型用。。。不要使用NHiberante(ORM)。。。但这是一个更大的话题。。。只是不要担心参考资料。它是有效的C#和有效的ORM;)我删除了子元素的string ID属性并添加了一个parent属性,现在我得到一个错误,它找不到“ID”属性的getter。应该为子元素使用代理键synthetic。例如,SQL Server中的自动生成列。这应该映射到属性Id。如果可能,没有复合键。其他任何东西(尽管受到支持)都会导致许多问题。尝试按文档中的标准方式(不动产)进行操作:。也许也请读一读:终于成功了,但一直很痛苦。非常感谢你的帮助。你有什么可以推荐的资源吗?
INSERT INTO ...
        (...columns...)
VALUES  (..., null, ...)
HasMany<EventParameter>(x => x.Children)
        .KeyColumns.Add("...")
        .Inverse()
        .Cascade.All();
var parent = ...;
var child = new Child();
// both sides MUST be set
parent.Children.Add(child);
child.Parent = parent;