实体框架核心部分类

时间:2018-02-02 19:16:00

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

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

实体框架项目(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一起使用:

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

1 个答案:

答案 0 :(得分:-1)

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

  

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

感谢所有关于如何实施解决方案的输入。我知道创建一个视图模型的选项,实际上我已经在很多情况下都这样做了,有时候只需要创建一个主要是copy&amp; amp;糊。