【问题标题】:One-way updates of columns using EntityFramework使用 EntityFramework 对列进行单向更新
【发布时间】:2012-10-23 15:23:30
【问题描述】:

EntityFramework 4.3.1.

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

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

我希望在保存到 db 时保留该值。但是当然 - 当我从 db 加载时没有得到更新。我可以在旁边放一个空设置器...但是当列为 Key 时它似乎不起作用。

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

现在我收到此错误:

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

【问题讨论】:

  • 如果不应该从数据库中读取计算的属性,您会使用什么?另外,你不能只在数据库中添加一个计算列吗?
  • 计算的列用于其他应用程序的进一步处理 - 我的应用程序不需要它们。我无法将计算列添加到数据库 - 不负责。

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


【解决方案1】:

首先,将 setter 设为私有:

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

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

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

第三,将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();
                }
            }
        }

    };
}

【讨论】:

    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多