使用EntityFramework对列进行单向更新

时间:2012-10-23 15:23:30

标签: database entity-framework entity-framework-4 .net-4.0

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,则会发生这种情况。

1 个答案:

答案 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();
                }
            }
        }

    };
}