1

因此,我们将一个旧的 wpf 应用程序移植到 .net core wpf 中。作为努力的一部分,我们还将数据层移动到EF.net core.

  1. 由于我们使用 Prism MVVM,在 DI 服务上下文中,我们保留了一个实时数据上下文,它跟踪用户通过 wpf 前端和服务显示和编辑的实体。
  2. 为了实现“撤消”功能,我们使用跟踪对象 entity.HasChangeTrackingStrategy(ChangeTrackingStrategy.ChangingAndChangedNotificationsWithOriginalValues);

在编辑时,对象会更新,在 Reload() 时,它会从跟踪的原始值恢复。就对象而言,操作还可以,但是,wpf 方面却无法正常工作。似乎 ef.net 核心是 wpf 应用程序的一个非常不适应的公民,假设它是 INotifyPropertyChanged 机制的唯一受益者。当然,这对于 WPF 来说一点也不真实。

  1. EF.net 在加载、重新加载等时似乎不使用属性。它直接在基础字段上工作。因此,NotifyPropertyChanged 永远不会触发,因此网格永远不会用新数据刷新,比如dbContext.Entry(c).Reload();. 所以问题 #1,有没有办法强制 ef.net 使用属性而不是字段?
  2. ef.net 的实现INotifyPropertyChanged似乎有缺陷。如果您在属性上调用 PropoertyChanged 事件,而不实际更改它,它会将实体标记为Modified,即使它可以轻松比较原始值和当前值。这禁止我们手动引发属性更改事件来控制 WPF 呈现。不知道如何解决这个问题,或者它是否可以解决,因为它只适用于这个跟踪策略。我愿意接受任何关于如何在不激怒 ef.net 的情况下通知 WPF 元素的建议。
  3. 确定对象的状态是相当复杂的操作,涉及的操作dbContext.Entry(entry).State存在于DataContext层次结构内的任何 WPF 绑定之外。它使绑定状态几乎不可能(例如更改脏条目的背景或显示保存按钮等)。NotifySetterObject我们通过从处理INotify*实现并保留[NotMapped] bool IsDirty标志的基类继承我们所有的实体类来“解决”它。不用说,我非常不喜欢这样,保留两个未链接的州旗听起来像是一场等待发生的事故。我想知道您是否遇到过类似的问题,以及您是否设计了一个更好、更理智的解决方案。

EF.net 似乎经历了从框架 ef.net 的重大变革转变,因为它只非常适合分离的上下文场景(如 asp.net)。我们是不是在浪费时间试图把这双鞋穿在 wpf 上?我们是否应该专注于更适合现场环境的不同 OR 引擎?

4

1 回答 1

3

在尝试解决您的问题之前,让我指出一些事情:

  1. 您正在使用 EF Core 3.0,它目前处于预览阶段(测试版),所以很多事情可能无法按预期工作。

  2. 如果ef.net您的意思是 EF6,即您移植的旧项目使用的是 EF6,则没有必要切换到 EF Core - EF6 也获得了 .Net Core 支持-此处提供了预览版。

现在关于您的具体问题:

  1. EF Core可以使用属性、字段或两者。这可以通过 fluent API 在上下文、实体和属性级别进行配置。只是 EF Core 3.0 默认值发生了变化 - 您可以在Breaking Changes 中看到 - 默认情况下使用支持字段。该链接还显示了如何通过使用获得所需的行为

    .UsePropertyAccessMode(PropertyAccessMode.FieldDuringConstruction)
    

在模型(所有实体)、实体(所有实体属性)或属性(特定实体属性)构建器上。

  1. ChangeTrackingStrategy文档中解释了该行为:

当实体提出PropertyChanging. PropertyChanged当实体引发事件时,属性被标记为已修改。

所以这是设计使然,因此您无能为力。但是解决 #1 消除了手动引发PropertyChanged事件的需要,并且双向绑定似乎完美无缺。

  1. 我不太确定你到底是什么。但是从 v2.1 开始,EF Core在-和上提供了 2 个状态更改事件,它们(尤其是第二个)可用于提供状态更改通知。但实际的机制是留给你的。例如,您可以使用 EF Core 2.1+实体构造函数服务注入功能来注入实体,而实体又可以订阅事件并为其自己的未映射属性引发等等。ChangeTrackerTrackedStateChangedDbContextStateChangedPropertyChangedState
于 2019-08-01T19:13:16.377 回答