gpt4 book ai didi

wpf - 没有 View 模型的 EF6 POCO INotifyPropertyChanged

转载 作者:行者123 更新时间:2023-12-02 04:53:11 26 4
gpt4 key购买 nike

我一直在 WPF 应用程序中直接绑定(bind)到模型类(并跳过创建单独的 View 模型类)。

现在,在切换到 EF6 和 DBContext 之后,我遇到了生成的 EF POCO 类的问题,因为它看起来有点棘手,甚至不建议尝试直接为这些类实现 INotifyPropertyChanged 接口(interface)。

目前:

  • 我不想回到 ObjectContext。
  • 我也不想对 T4 做太多改动。网上关于改T4实现的建议INotifyPropertyChanged 对我来说太容易出错了。
  • 现在为每个类创建 View 模型并完全转向 MVVM可能是最好的,但现在需要很多时间来实现,因为模型很大。

我是否还有任何选项可以获取 EF6 POCO 类自动生成的属性以通知它们的更改?

最佳答案

T4 模板是您最好的 friend 。你几乎无法避免它们选项 1 - 修改现有的 T4 模板以实现 INotifyPropertyChanged

  1. 创建一个实现 INotifyPropertyChanged 的​​基类
  2. 修改 T4 模板中的 getter 和 setter 以通知它们属性(property)变动

选项 2 - 引入 DTO/ViewModel 并使用 AutoMapper

  1. 向您的项目添加一个新文件夹(或创建另一个项目)
  2. 添加新的POCO生成T4模板
  3. 稍微修改它以符合您选择的 View 模型
  4. 使用 AutoMapper 将这些 Dto/ViewModel 映射到实体

选项 3 - 实现 Postsharp,它使用面向方面的编程来实现 INotifyPropertyChanged每个类有一行属性 - 同样,您必须向 T4 模板添加几行

编辑 - 例子这是一个包含我的实体的 T4 模板,我添加了 [DataContract] 属性以允许序列化 POCO。

foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
{
fileManager.StartNewFile(entity.Name + ".cs");
BeginNamespace(code);
#>
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
using System.Runtime.Serialization;
[DataContract]
<#=codeStringGenerator.EntityClassOpening(entity)#>
{

// Then further down
var simpleProperties = typeMapper.GetSimpleProperties(entity);
if (simpleProperties.Any())
{
foreach (var edmProperty in simpleProperties)
{
#>
[DataMember]
<#=codeStringGenerator.Property(edmProperty)#>
<#

关于wpf - 没有 View 模型的 EF6 POCO INotifyPropertyChanged,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25861917/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com