C# 当另一个属性更改时(实体初始化后)更新实体属性

C# 当另一个属性更改时(实体初始化后)更新实体属性,c#,wpf,entity-framework,code-first,C#,Wpf,Entity Framework,Code First,我在一个由SQL CE数据库支持的WPF MVVM应用程序中使用实体框架和代码优先的方法。我试图设计一个模型类,它可以简单地更新它的一个属性值,以响应另一个属性值的变化。基本上,我正在寻找一种方法来定义一个poco,该poco在实例被EF初始化后是“自跟踪”的。如果答案是先放弃代码,那么这可能是唯一可行的途径(不确定)。一个基本的例子: class ThingModel { 公共int Id{get;set;} public bool OutsideDbNeedsUpdate{get;set;}

我在一个由SQL CE数据库支持的WPF MVVM应用程序中使用实体框架和代码优先的方法。我试图设计一个模型类,它可以简单地更新它的一个属性值,以响应另一个属性值的变化。基本上,我正在寻找一种方法来定义一个poco,该poco在实例被EF初始化后是“自跟踪”的。如果答案是先放弃代码,那么这可能是唯一可行的途径(不确定)。一个基本的例子:

class ThingModel
{
公共int Id{get;set;}
public bool OutsideDbNeedsUpdate{get;set;}
私人字符串(u foo),;
公共字符串Foo
{
获取{return\u foo;}
设置
{
如果(_foo!=值)
{
_foo=价值;
OutsideDbNeedsUpdate=真;
}
}
}
}
但是,上面的问题是,每当DbContext在运行时初始化实例并设置字段时,我的类都会过早地在响应中设置依赖字段。换句话说,我正在搜索一个简单的模式,该模式允许我的poco类仅在EF完成实例上字段的初始化后执行此特殊更改跟踪

我意识到我可以做一些类似解决方案的事情
但是我的商业案例要求这种特殊的变更跟踪与EF变更跟踪分离,换句话说,我需要能够保存变更,而不管上面HasChanges属性的状态如何。这是因为我希望能够定期检查实体上的HasChanges属性,然后更新外部数据库中的依赖值(与支持EF DbContext的数据库不同),并且在推送到外部数据库之间,EF DB可能会发生许多更改/保存。因此,我希望只保留数据库中记录的标志,并在外部数据库定期更新时将其重置为false。

编辑后,我认为您可以使用

在对象上设置了所有标量、复数和引用属性之后,但在加载集合之前,将引发此事件

将其放入
DbContext
的构造函数中:

((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized +=
    HandleObjectMaterialized;
方法是:

private void HandleObjectMaterialized(object sender, ObjectMaterializedEventArgs e)
{ }
现在的问题是,在方法体中放什么?可能最简单的解决方案是定义一个接口

interface IChangeTracker
{
    bool Materialized { get; set; }
    bool OutsideDbNeedsUpdate { get; }
}
并让要跟踪的类实现此接口

然后,在
HandleObjectMaterialized
中,您可以执行以下操作:

var entity = e.Entity as IChangeTracker;
if (entity != null)
{
    entity.Materialized = true;
}
在此之后,您就知道什么时候可以在内部设置
OutsideDbNeedsUpdate


原文

通常,不建议具有具有副作用的属性(更确切地说,副作用比更改表示的状态更多)。也许这条规则也有例外,但大多数时候,在属性之间建立依赖关系并不是一个好主意

我不得不猜测一下你能做得最好的是什么,因为我不知道你真正的代码是关于什么的,但也许可以把逻辑放在getter中。举个例子:

public State State
{
   get { return this.EndDate.HasValue ? MyState.Completed : this._state; }
   set { this._state = value; }
}
这不会删除相互依赖关系,但会将生效时间推迟到访问属性时。在您的情况下,这可能不早于
SaveChanges()

另一个策略是创建一个同时设置两个属性的方法。方法预计会有副作用,特别是当它们的名称清楚地表明它的时候。您可以使用类似于
SetMasterAndDependent(stringmaster)
的方法


现在,方法在数据绑定场景中并不方便。在这种情况下,您最好让视图模型设置这两个属性,或者如上所述调用方法。

+1考虑一下,我倾向于同意具有副作用的属性。我的问题是,我希望我的poco是“自跟踪”的,因为依赖属性实际上只需要是一个标志,表明实例已经更改(在被数据上下文初始化之后)。我正在编辑我的问题,以更明确地反映这一点。有趣的解决方案格特!对于我的案例,监视对象物化似乎很合理。再次感谢。