【问题标题】:EF6 POCO INotifyPropertyChanged without viewmodelsEF6 POCO INotifyPropertyChanged 没有视图模型
【发布时间】:2014-11-09 19:09:45
【问题描述】:

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

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

目前:

  • 我不想回到 ObjectContext。
  • 我也不想过多地改变 T4。网上关于改T4实现的建议 INotifyPropertyChanged 对我来说太容易出错了。
  • 现在为每个类创建视图模型并纯粹使用 MVVM 可能是最好的,但现在需要很多时间来实施,因为模型 很大。

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

【问题讨论】:

    标签: wpf entity-framework-6 poco inotifypropertychanged


    【解决方案1】:

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

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

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

    1. 为您的项目添加一个新文件夹(或创建另一个项目)
    2. 新增POCO代T4模板
    3. 稍微修改它以符合您选择的视图模型
    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)#>
    <#
    

    【讨论】:

    • 由于时间限制,选项 1 可能是目前唯一的选项。我有一个实现 INotifyPropertyChanged 的​​基类,并且我已经(通过部分类)每个 POCO 类来实现它。 T4 需要进行哪些更改?我不是很懂T4逻辑。
    • 选项 3 也很有趣。以前从未使用过 Postsharp。即使不编辑 T4 也能工作 -> 我将为每个模型类创建一个部分类并将 [NotifyPropertyChanged] 属性插入到那里的类中。
    • 是的。我忘记了部分。但是,根据模型的大小,您最好还是编辑模板或创建一个新模板。一旦你“得到”了 T4,你就可以用它写音乐了。我有一套为旧版客户端应用程序生成 Delphi 源代码!
    • 用示例更新答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    相关资源
    最近更新 更多