我在配方属性,更新和nhibernate
方面遇到了一些麻烦假设,我有下一个模型:
public class Model
{
public virtual Guid Id { get; set; }
public virtual string Name { get; set; }
public virtual State CurrentState { get; protected set; }
public virtual ICollection<State> History { get; set; }
public Model()
{
State = new List<State>();
}
}
public class State
{
public virtual Guid Id { get; set; }
public virtual DateTime Timestamp { get; set; }
public virtual string Description { get; set; }
public virtual string Author { get; set; }
public virtual Model Owner { get; set; }
}
这是我的映射(NHibernate 4.0.0.4000,使用代码映射(不是fluentnhibernate))
public class ModelMapping: ClassMapping<Model>
{
public ModelMapping()
{
Id(x => x.Id, m => m.Generator(Generators.Assigned));
Property(x => x.Name);
ManyToOne(x => x.CurrentState, c =>
{
c.Formula("(select top(1) s.Id from State s where s.Owner = Id order by s.Timestamp desc)");
});
Bag(x => x.History, c =>
{
c.Cascade(Cascade.All);
c.Key(k =>
{
k.ForeignKey("none");
k.Column("ParentId");
});
c.OrderBy(x => x.Timestamp);
});
}
}
public class StateMapping: ClassMapping<State>
{
public StateMapping()
{
Id(x => x.Id);
Property(x => x.Timestamp);
Property(x => x.Description);
Property(x => x.Author);
ManyToOne(x => x.Owner, c => c.Column("ParentId"));
}
}
现在,我想要检索一些模型实体(通过了解他们的id),
var model = modelRepository.Get(<someId>);
如果我看到model.CurrentState,我看到正确的状态(model.CurrentState = model.History.Last())
接下来,我尝试添加新状态并保存实体
model.History.Add(new State(){...});
modelRepository.Save(model);
在这个内容的模型之后。历史是好的(我在集合和数据库中看到新状态),但属性CurrentState的值没有更新(并且等于检索时刻的状态)。
是否有任何方法可以在保存实体后更新公式属性?
答案 0 :(得分:1)
让加载的实体刷新的唯一方法是调用刷新或重新加载实体。
您的历史记录看起来是正确的,因为您实际上在本地更改了该状态并将更新发送到服务器。
这是相关链接。 https://weblogs.asp.net/ricardoperes/nhibernate-pitfalls-entity-refresh