NHibernate - 无法保存子实体
NHibernate - Unable to save child entities
这应该是一个简单的 1-N 关系,但是我无法保存子项,因为 NHibernate 在子项的插入语句中使用 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() {}
}
映射是这样的
public EventMapping()
{
Table(...);
Id(x => x.Id)
.Column(...)
.GeneratedBy
.Custom<global::NHibernate.Id.SequenceGenerator>(builder => builder.AddParam("sequence", "..."));
Map(x => x.Name).Column("Name").Length(100);
HasMany<EventParameter>(x => x.Parameters)
.KeyColumns.Add(...)
.Inverse()
.Cascade.All();
}
public EventParameterMapping()
{
Table(....);
CompositeId()
.KeyProperty(x => x.Event.Id, "...")
.KeyProperty(x => x.ParameterId, "...");
References(x => x.Event);
}
父项的 Insert 语句是正确的,但对于子项则不正确。
INSERT INTO ...
(...columns...)
VALUES (..., null, ...)
在此之前,我收到以下警告:无法确定实体是瞬态的还是分离的;查询数据库。在会话中使用明确的 Save() 或 Update() 来防止这种情况。
我确实在事务中使用了 Save()。知道为什么会这样吗?
这里的解决方案出奇的简单。我们必须使用 inverse="true"
映射:
HasMany<EventParameter>(x => x.Children)
.KeyColumns.Add("...")
.Inverse()
.Cascade.All();
但是,这是一种优化,需要在我们的 C# 代码中始终正确设置关系的两边:
var parent = ...;
var child = new Child();
// both sides MUST be set
parent.Children.Add(child);
child.Parent = parent;
详情请关注
这应该是一个简单的 1-N 关系,但是我无法保存子项,因为 NHibernate 在子项的插入语句中使用 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() {}
}
映射是这样的
public EventMapping()
{
Table(...);
Id(x => x.Id)
.Column(...)
.GeneratedBy
.Custom<global::NHibernate.Id.SequenceGenerator>(builder => builder.AddParam("sequence", "..."));
Map(x => x.Name).Column("Name").Length(100);
HasMany<EventParameter>(x => x.Parameters)
.KeyColumns.Add(...)
.Inverse()
.Cascade.All();
}
public EventParameterMapping()
{
Table(....);
CompositeId()
.KeyProperty(x => x.Event.Id, "...")
.KeyProperty(x => x.ParameterId, "...");
References(x => x.Event);
}
父项的 Insert 语句是正确的,但对于子项则不正确。
INSERT INTO ...
(...columns...)
VALUES (..., null, ...)
在此之前,我收到以下警告:无法确定实体是瞬态的还是分离的;查询数据库。在会话中使用明确的 Save() 或 Update() 来防止这种情况。
我确实在事务中使用了 Save()。知道为什么会这样吗?
这里的解决方案出奇的简单。我们必须使用 inverse="true"
映射:
HasMany<EventParameter>(x => x.Children)
.KeyColumns.Add("...")
.Inverse()
.Cascade.All();
但是,这是一种优化,需要在我们的 C# 代码中始终正确设置关系的两边:
var parent = ...;
var child = new Child();
// both sides MUST be set
parent.Children.Add(child);
child.Parent = parent;
详情请关注