【发布时间】: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