【问题标题】:Entity Framework Core partial classes实体框架核心部分类
【发布时间】:2018-07-13 08:29:58
【问题描述】:

我正在尝试在多个项目中重用我的模型和上下文。为此,我创建了一个包含模型类以及上下文的项目/Nuget 包(.Net Standard 2.0)。这在 .Net Core 和 Windows 窗体中运行良好。以下是我所做的简化示例:

实体框架项目(EF Core 2.0):

Person.cs:

namespace EfCoreLib {
    public class Person {
        [Key]
        [Required]
        public int Id { get; set; }

        [Required]
        [MaxLength(40)]
        public string Firstname { get; set; }

        [Required]
        [MaxLength(40)]
        public string Lastname { get; set; }
    }
}

PersonContext.cs:

namespace EfCoreLib {
    public class PersonContext:DbContext {
        public DbSet<Person> Persons{ get; set; }
    }
}

Windows 窗体应用项目:

PersonForm.cs

public partial class PersonForm : Form {
        public PersonForm() {
            InitializeComponent();
        }

        private void PersonForm_Load(object sender, EventArgs e) {
            PersonContext db = new PersonContext();
            var allPersons = from p in db.Persons select p;
        }
 }

在 Windows 窗体应用程序中,我希望有一些模型属性仅用于绑定目的(例如 bool 绑定到控件的启用属性或格式化字符串以显示在网格中)。在 EF6 中,我使用与我的模型相同的命名空间中的部分类(也必须是部分类)来实现这一点。这曾经适用于 EF 6:

Person.cs 在 Windows 窗体应用程序项目中:

namespace EfCoreLib {
    public partial class Person {
        public string Displayname {
            get {
                return $"{Firstname} {Lastname}";
            }
        }
    }
}

如果我使用 EF Core 尝试此操作,我将在 Person.cs 中收到错误 CS103,因为它确实识别属性 firstname 和 lastname。此外,PersonForm.cs 中还会出现错误 CS0436。

作为一种解决方法,我可以在 EF 项目中实现这些属性,但由于它们是使用应用程序所独有的,这意味着每次我需要对其中一个应用程序进行更改时,我都需要重新部署包。

有人知道如何使用 EF 项目中的模型和上下文,并在消费应用程序中使用一些属性对其进行扩展吗?

【问题讨论】:

  • 部分定义不能跨越多个模块。我会使用 T4 来读取实体并为每个实体创建 ViewModel 作为部分类。然后我会简单地添加所需的逻辑。灵活、快速并消除因复制和粘贴而产生的错误。我会去 WPF... 没有表格
  • 另一个副作用是您可以读取属性并使用它们执行一些验证逻辑。例如使用 INotifyDataErrorInfo
  • A “bool to bind on enabled property”属于 ViewModel。这就是你需要的——不要拉伸你的模型来做 GUI 的东西。查看 WinForms 或 WPF+MVVM 的 MVP。
  • @Marco 您评论的第一部分很好。但第二个是题外话。 “我会选择 WPF...” - 如果这不是您的选择,而您又不能选择怎么办。它与问题无关。

标签: c# .net entity-framework-core


【解决方案1】:

最后@Marco 在他的评论中发布了答案。

部分定义不能跨越多个模块。

感谢大家就如何实施解决方案提供意见。我知道创建视图模型的选项,实际上我已经在很多情况下这样做了,有时最好省下创建一个主要是复制和粘贴的附加类的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 2020-05-10
    • 2020-09-12
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多