在实体框架中,如何让属性设置器将属性标记为在快照模式下更改

时间:2017-04-28 22:15:49

标签: c# entity-framework

我的经理要求开发人员亲自为当前对该实体所做的任何实体更改设置ModifiedUserId字段。因此,我重写了SaveChanges方法,以便检查任何已修改实体的ModifiedUserId属性以查看它是否已设置。如果尚未设置,我们会抛出错误。

这很好用,除了我们的EF正在使用快照更改检测,因此如果ModifiedUserId已经是83,并且开发人员根据我们的要求将值设置为相同的用户ID,则ModifiedUserId不会被标记为已更改的属性,因此我的检查最终失败了。

我已经研究过创建我们自己的更改代理但是听说它可能很慢。有没有办法让EF检测到我们实际上设置了ModifiedUserId属性,即使它在快照模式下是相同的?还有其他想法吗?谢谢。

1 个答案:

答案 0 :(得分:0)

前言:我真的不喜欢抛出异常的想法,而且我只会在不在极少数情况下将实体设置为修改。

这就是说,如果你有权访问上下文,你可以这样做:

DbEntityEntry entry = context.Entry(myTrackedEntity);
entry.State = EntityState.Modified;

如果您无法访问上下文,或者假设您希望在设置属性时“自动”发生这种情况,则可以执行以下操作:

public class MyTrackedEntity
{
    // Your class stuff goes here.

    private int _modifiedUserId
    public int ModifiedUserId
    {
        get
        {
            return _modifiedUserId;
        }
        set
        {
            if (value != _modifiedUserId)
                _modifiedUserId = value;

            // This will be heavy, cpu-wise.
            var field = this.GetType().GetField("_entityWrapper");
            if (field != null)
            {
                var wrapper  = field.GetValue(this);
                var property = wrapper.GetType().GetProperty("Context");
                var context  = (ObjectContext)property.GetValue(wrapper, null);
                DbEntityEntry entry = context.Entry(this);
                entry.State = EntityState.Modified;
            }
            else
            {
                // If you're here, your entity isn't tracked.
            }
        }
    }
}
来自this postthat article

受到大肆启发