Castle ActiveRecord - 如何知道对象实例是否是瞬态的?

时间:2011-02-25 13:02:15

标签: castle-activerecord

标题很漂亮意味着我正在尝试做什么。有一种方法可以知道对象实例是否是瞬态的? (或者,至少,还没有保存?)

谢谢大家!

PS。:不使用Exists方法。

1 个答案:

答案 0 :(得分:1)

通常这是将实体的PK属性的值与定义的unsaved-value进行比较。最常见的情况是使用没有定义的未保存值的int PK,例如:

[PrimaryKey]
public virtual int Id {get;set;}

在这种情况下,unsaved-value为0,因此您可以将Id的值与0进行比较,以确定它是否是瞬态的。

如果您想更一般地执行此操作,可以从ActiveRecord模型中获取未保存的值,并与使用反射的值进行比较,例如: (未经测试!):

var entity = new MyEntity();
var pk = ActiveRecordModel.GetModel(typeof(MyEntity)).PrimaryKey;
var unsavedValue = pk.PrimaryKeyAtt.UnsavedValue;
var convertedUnsavedValue = Convert.ChangeType(unsavedValue, pk.Property.PropertyType);
var pkValue = pk.Property.GetValue(aform, null);
var transient = Equals(convertedUnsavedValue, pkValue);

面对null UnsavedValues(在这种情况下你应该与PK类型的默认值进行比较),这可能会失败,但它应该让你开始。