我在数据库优先上下文中使用 EF6。在这种情况下,我在我的 MVC Web 项目中使用实体类,并希望使用各种验证和显示属性来注释实体的字段。但是,当我通过在我的 edmx 设计器中从数据库进行更新来刷新实体类时,类会重新生成并且我的属性会丢失。
解决这个问题的最佳方法是什么?
我在数据库优先上下文中使用 EF6。在这种情况下,我在我的 MVC Web 项目中使用实体类,并希望使用各种验证和显示属性来注释实体的字段。但是,当我通过在我的 edmx 设计器中从数据库进行更新来刷新实体类时,类会重新生成并且我的属性会丢失。
解决这个问题的最佳方法是什么?
在数据库优先实体框架项目中使用生成的实体类时,通常需要将属性应用于类的字段。如果您放弃使用 ViewModel 并直接在 MVC Web 项目中使用您的实体,情况尤其如此。
当然,如果您要直接对字段应用验证或显示名称属性,那么下次由于从数据库操作升级而生成数据模型时,这些都将被覆盖。
幸运的是,Entity Framework 生成的类被标记为部分。这意味着我们可以创建第二个类来增强第一个类。实际上,这两个类被视为一个类。例如:
[MetadataType(typeof(AnimalMetaData))]
public partial class Animal
{
public int ID { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public int NumberOfLegs { get; set; } etc..
public class AnimalMetaData
{
[MaxLength(200)]
[Required]
public string Name { get; set; }
[MaxLength(1000)]
public string Description { get; set; } etc...
但是当然我们这里有一个问题。我们已经将属性关联到实体类上的元数据类,这将在数据库更新时被覆盖。那么我们如何解决这个问题呢?简单的!我们创建了第三个名为 Animal 的“虚拟”类,它位于元数据类旁边,也是部分的:
[MetadataType(typeof(AnimalMetaData))]
public partial class Animal {}
我们用我们的元数据类来注释这个类,所以实际上我们有三个类作为一个类;实体本身,将实体与元数据定义类链接的虚拟类。
为了保持整洁,您可以做得更糟,而不是将元数据和虚拟类放在与 Entity Framework 生成的实体相邻的单独文件夹中。