0

实体框架 4.3.1。

计算应该存储在数据库中但不打算从数据库中检索的属性的最佳方法是什么?例如

    [Column("SOME_COLUMN")]
    public ulong SomeColumn
    {
        get { return /*calculate here*/; }
    }

我希望在保存到 db 时保持该值。但是当然 - 当我从 db 加载时没有得到更新。我可以在旁边放一个空的二传手......但是当列是键时它似乎不起作用。

我可以有这样一个键列吗?

现在我收到此错误:

EntityFramework 错误:作为对象键一部分的属性值与存储在 ObjectContext 中的相应属性值不匹配。如果作为键的一部分的属性返回不一致或不正确的值,或者在对作为键的一部分的属性进行更改后未调用 DetectChanges,则可能会发生这种情况。

4

1 回答 1

1

首先,将 setter 设为私有:

[Column("SOME_COLUMN")]
public ulong SomeColumn { get; private set; }

其次,在对象中添加一个计算方法(这样就可以访问私有的setter了):

public void CaculateSomeColumn(){
    this.SomeColumn = /* some calculation */;
}

第三,SavingChanges向 Repository 上下文对象 ( 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();
                }
            }
        }

    };
}
于 2012-10-23T17:23:58.083 回答