EntityFramework 4.3.1。
具有应存储在db中的计算属性的最佳方法是什么,但不打算从db中检索? E.g。
[Column("SOME_COLUMN")]
public ulong SomeColumn
{
get { return /*calculate here*/; }
}
我希望在保存到db时保持值。但是当然 - 当我从db加载时没有得到更新。我可以在旁边有一个空的setter ......但是当列是Key时它似乎不起作用。
我可以拥有这样一个Key-column吗?
现在我收到了这个错误:
EntityFramework错误:作为对象键的一部分的属性的值与存储在ObjectContext中的相应属性值不匹配。如果属于键的属性返回不一致或不正确的值,或者在对属于键的属性进行更改后未调用DetectChanges,则会发生这种情况。
答案 0 :(得分:1)
首先,将setter设为私有:
[Column("SOME_COLUMN")]
public ulong SomeColumn { get; private set; }
其次,在对象中添加一个计算方法(因此它可以访问私有的setter):
public void CaculateSomeColumn(){
this.SomeColumn = /* some calculation */;
}
第三,向Repository上下文对象(SavingChanges
)添加MyEntities
回调。可以在上下文构造函数中定义此回调,并且应该为已添加或修改的类型(MyPoco
)项设置计算字段:
public MyEntities(){
this.SavingChanges += (sender, eventArgs) => {
ObjectContext context = sender as ObjectContext;
if (context != null)
{
foreach (ObjectStateEntry entry in
context.ObjectStateManager.GetObjectStateEntries(
EntityState.Added | EntityState.Modified))
{
if (!entry.IsRelationship && (entry.Entity.GetType() == typeof(MyPoco)))
{
var myObject = entry.Entity as MyPoco;
myObject.CalculateSomeColumn();
}
}
}
};
}