3

我在数据库优先上下文中使用 EF6。在这种情况下,我在我的 MVC Web 项目中使用实体类,并希望使用各种验证和显示属性来注释实体的字段。但是,当我通过在我的 edmx 设计器中从数据库进行更新来刷新实体类时,类会重新生成并且我的属性会丢失。

解决这个问题的最佳方法是什么?

4

1 回答 1

4

在数据库优先实体框架项目中使用生成的实体类时,通常需要将属性应用于类的字段。如果您放弃使用 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 生成的实体相邻的单独文件夹中。

于 2016-03-04T14:54:01.350 回答