C# 实体框架核心部分类

C# 实体框架核心部分类,c#,.net,entity-framework-core,C#,.net,Entity Framework Core,我试图在多个项目中重用我的模型和上下文。为此,我创建了一个project/Nuget包.Net Standard 2.0,其中包含模型类和上下文。这在.NETCore和Windows窗体中都很有效。以下是我所做工作的简化示例: 实体框架项目EF Core 2.0: Person.cs: PersonContext.cs: 在Windows窗体应用程序中,我希望有一些仅用于绑定目的的模型属性,例如控件的bool to bind on enabled属性或在网格中显示的格式化字符串。在EF6中,我在

我试图在多个项目中重用我的模型和上下文。为此,我创建了一个project/Nuget包.Net Standard 2.0,其中包含模型类和上下文。这在.NETCore和Windows窗体中都很有效。以下是我所做工作的简化示例:

实体框架项目EF Core 2.0:

Person.cs:

PersonContext.cs:

在Windows窗体应用程序中,我希望有一些仅用于绑定目的的模型属性,例如控件的bool to bind on enabled属性或在网格中显示的格式化字符串。在EF6中,我在与我的模型相同的命名空间中使用了分部类,该模型也必须是分部类才能实现这一点。这用于EF 6:

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

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项目中的模型和上下文,并在消费应用程序中使用一些属性对其进行扩展吗?

最后@Marco在他的评论中给出了答案


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


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

部分定义不能跨越多个模块。我将使用T4来读取实体,并将ViewModels创建为每个实体的分部类。然后我将简单地添加所需的逻辑。灵活、快速并消除因复制和粘贴而产生的错误。我会选择WPF。。。没有其他的副作用是,您可以读取属性并使用它们执行一些验证逻辑。例如,使用INotifyDataErrorInfoA bool绑定ViewModel上的已启用属性。这正是您在这里所需要的-不要为了做GUI的事情而拉伸您的模型。查看WinForms的MVP或WPF+MVVM。@Marco您的评论的第一部分很好。但第二个是离题的。我会选择WPF…-如果那不是你的选择,你不能。这与这个问题无关。
namespace EfCoreLib {
    public class PersonContext:DbContext {
        public DbSet<Person> Persons{ get; set; }
    }
}
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;
        }
 }
namespace EfCoreLib {
    public partial class Person {
        public string Displayname {
            get {
                return $"{Firstname} {Lastname}";
            }
        }
    }
}