EF6 POCO INotifyPropertyChanged 没有视图模型
Posted
技术标签:
【中文标题】EF6 POCO INotifyPropertyChanged 没有视图模型【英文标题】:EF6 POCO INotifyPropertyChanged without viewmodels 【发布时间】:2014-11-09 19:09:45 【问题描述】:我一直在 WPF 应用程序中直接绑定到模型类(并跳过创建单独的视图模型类)。
现在,在切换到 EF6 和 DBContext 后,我遇到了生成的 EF POCO 类的问题,因为它看起来有点棘手,甚至不建议尝试将 INotifyPropertyChanged 接口直接实现到这些类。
目前:
我不想回到 ObjectContext。 我也不想过多地改变 T4。网上关于改T4实现的建议 INotifyPropertyChanged 对我来说太容易出错了。 现在为每个类创建视图模型并纯粹使用 MVVM 可能是最好的,但现在需要很多时间来实施,因为模型 很大。我是否有任何选项可以让 EF6 POCO 类自动生成的属性通知它们的更改?
【问题讨论】:
【参考方案1】:T4 模板是您最好的朋友。你几乎无法避免它们 选项 1 - 修改现有 T4 模板以实现 INotifyPropertyChanged
-
创建一个实现 INotifyPropertyChanged 的基类
修改 T4 模板中的 getter 和 setter 以通知他们的
属性变化
选项 2 - 引入 DTO/ViewModel 并使用 AutoMapper
-
为您的项目添加一个新文件夹(或创建另一个项目)
新增POCO代T4模板
稍微修改它以符合您选择的视图模型
使用 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)#>
<#
【讨论】:
由于时间限制,选项 1 可能是目前唯一的选项。我有一个实现 INotifyPropertyChanged 的基类,并且我已经(通过部分类)每个 POCO 类来实现它。 T4 需要进行哪些更改?我不是很懂T4逻辑。 选项 3 也很有趣。以前从未使用过 Postsharp。即使不编辑 T4 也能工作 -> 我将为每个模型类创建一个部分类并将 [NotifyPropertyChanged] 属性插入到那里的类中。 是的。我忘记了部分。但是,根据模型的大小,您最好还是编辑模板或创建一个新模板。一旦你“得到”了 T4,你就可以用它写音乐了。我有一套为旧版客户端应用程序生成 Delphi 源代码! 用示例更新答案以上是关于EF6 POCO INotifyPropertyChanged 没有视图模型的主要内容,如果未能解决你的问题,请参考以下文章