C# 如何更新(通过合并)edmx而不重写asp.net mvc中的模型类

C# 如何更新(通过合并)edmx而不重写asp.net mvc中的模型类,c#,asp.net-mvc,entity-framework,orm,entity-framework-6,C#,Asp.net Mvc,Entity Framework,Orm,Entity Framework 6,我正在asp.NETMVC中开发一个应用程序。我使用实体框架作为ORM。我有个问题。要使用javascript非结构化验证,我需要向模型对象添加注释。例如[必需],[电子邮件地址]。但是,当我们向数据库中添加一些内容并对其进行更新时,所有模型类都会被覆盖,所有注释都会消失。或者,一旦打开edmx,自动模型类将自动替代。我怎样才能解决这个问题。有几十个屏幕和类,edmx中的任何细微更改都会删除所有类中的注释,造成巨大的时间浪费 // <auto-generated> using Sy

我正在asp.NETMVC中开发一个应用程序。我使用实体框架作为ORM。我有个问题。要使用javascript非结构化验证,我需要向模型对象添加注释。例如[必需],[电子邮件地址]。但是,当我们向数据库中添加一些内容并对其进行更新时,所有模型类都会被覆盖,所有注释都会消失。或者,一旦打开edmx,自动模型类将自动替代。我怎样才能解决这个问题。有几十个屏幕和类,edmx中的任何细微更改都会删除所有类中的注释,造成巨大的时间浪费

// <auto-generated>

using System.ComponentModel.DataAnnotations;

namespace MerinosSurvey.Models
{
using System;
using System.Collections.Generic;

public partial class Surveys
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Surveys()
    {
        this.SurveyQuestions = new HashSet<SurveyQuestions>();
        this.SurveyCustomers = new HashSet<SurveyCustomers>();
    }

    public int SurveyId { get; set; }
    [Required(ErrorMessage = "Plase enter survey name.")]
    public string SurveyName { get; set; }
    [Required(ErrorMessage = "Please enter survey description.")]
    public string SurveyDescription { get; set; }

    // [DataType(DataType.Date)]
    public System.DateTime? CreatedDate { get; set; }
    //[DataType(DataType.Date)]

    public System.DateTime? UpdatedDate { get; set; }
    public int CreatedUserId { get; set; }
    public bool IsActive { get; set; }
    public bool Status { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<SurveyQuestions> SurveyQuestions { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<SurveyCustomers> SurveyCustomers { get; set; }

    public string Token { get; set; }
}
}
//
使用System.ComponentModel.DataAnnotations;
namespace-survey.Models
{
使用制度;
使用System.Collections.Generic;
公共部分班级调查
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公众调查()
{
this.SurveyQuestions=new HashSet();
this.SurveyCustomers=new HashSet();
}
public int SurveyId{get;set;}
[必需(ErrorMessage=“请输入调查名称”。)]
公共字符串SurveyName{get;set;}
[必需(ErrorMessage=“请输入调查说明”。)]
公共字符串SurveyDescription{get;set;}
//[数据类型(DataType.Date)]
public System.DateTime?CreatedDate{get;set;}
//[数据类型(DataType.Date)]
public System.DateTime?updateDate{get;set;}
public int CreatedUserId{get;set;}
公共bool IsActive{get;set;}
公共布尔状态{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection调查问题{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection SurveyCustomers{get;set;}
公共字符串标记{get;set;}
}
}
编辑为 元数据

调查部分和元数据

 //PartialClass
 [MetadataType(typeof(SurveyMetadata))]
 public partial class Surveys
{
}
//Metadata
 public partial class SurveyMetadata
{
    public int SurveyId { get; set; }
    [Required(ErrorMessage = "Lütfen anket adını giriniz.")]
    public string SurveyName { get; set; }
    [Required(ErrorMessage = "Lütfen anket açıklamasını giriniz.")]
    public string SurveyDescription { get; set; }

    // [DataType(DataType.Date)]
    public System.DateTime? CreatedDate { get; set; }
    //[DataType(DataType.Date)]

    public System.DateTime? UpdatedDate { get; set; }
    public int CreatedUserId { get; set; }
    public bool IsActive { get; set; }
    public bool Status { get; set; }

    public virtual ICollection<SurveyQuestionMetadata> SurveyQuestionMetadatas { get; set; }
    public virtual ICollection<SurveyCustomerMetadata> SurveyCustomerMetadatas { get; set; }

    public string Token { get; set; }
}
//PartialClass
[元数据类型(typeof(SurveyMetadata))]
公共部分班级调查
{
}
//元数据
公共部分类调查数据
{
public int SurveyId{get;set;}
[必需(ErrorMessage=“Lütfen anket adınıgirizing.”)
公共字符串SurveyName{get;set;}
[必需(ErrorMessage=“Lütfen anket açıklamasınıgirizing.”)
公共字符串SurveyDescription{get;set;}
//[数据类型(DataType.Date)]
public System.DateTime?CreatedDate{get;set;}
//[数据类型(DataType.Date)]
public System.DateTime?updateDate{get;set;}
public int CreatedUserId{get;set;}
公共bool IsActive{get;set;}
公共布尔状态{get;set;}
公共虚拟ICollection SurveyQuestionMetadatas{get;set;}
公共虚拟ICollection SurveyCustomerMetadatas{get;set;}
公共字符串标记{get;set;}
}
GetData Ajax事件

  // GET: Survey
    public ActionResult GetData()
    {
        using (MerinosSurveyEntities entity = new MerinosSurveyEntities())
        {
            List<Surveys> surveys = entity.Surveys.Where(x => x.IsActive && x.Status)
                .OrderBy(x => x.SurveyId).ToList();
            return Json(new { data = surveys }, JsonRequestBehavior.AllowGet);
        }
    }
//GET:Survey
公共操作结果GetData()
{
使用(MerinosSurveyEntities实体=新MerinosSurveyEntities())
{
列表调查=实体。调查。其中(x=>x.IsActive&&x.Status)
.OrderBy(x=>x.SurveyId).ToList();
返回Json(新的{data=surveys},JsonRequestBehavior.AllowGet);
}
}

我应该如何更改GetData事件。客户端应该有哪些列表???

最佳做法是,使用ViewModel[而不是实体/模型类]在客户端进行操作/播放

因此,请使用ViewModel,继承模型类,然后使用注释 例如。 公共类ViewModelClass:ModelClass { [必须填写(“必须填写姓名”)] 公共字符串名{get;set;}
}最佳实践是,使用ViewModel[而不是实体/模型类]在客户端进行操作/播放

因此,请使用ViewModel,继承模型类,然后使用注释 例如。 公共类ViewModelClass:ModelClass { [必须填写(“必须填写姓名”)] 公共字符串名{get;set;}
}

要做这些事情,可以使用分部类,并在类上方的.net核心注释中使用“ModelMetadataType”。 让我们用代码来做: 这是在edmx中创建的模型:

public partial class Student{
     public string FirstName {get; set;}
}
首先,您必须在另一个文件中创建一个与student类同名的分部类,并注意其名称空间应与上面的类相同。(类必须不在edmx文件中)

最后,您必须创建如下元数据类:

public class StudentMetaData{
     [Display(name="First Name")]
     public string FirstName {get; set;}
}
现在,您可以更新edmx文件,而无需更改元数据类中的数据注释


要做这些事情,可以使用分部类,并在类上方的.net核心注释中使用“ModelMetadataType”。 让我们用代码来做: 这是在edmx中创建的模型:

public partial class Student{
     public string FirstName {get; set;}
}
首先,您必须在另一个文件中创建一个与student类同名的分部类,并注意其名称空间应与上面的类相同。(类必须不在edmx文件中)

最后,您必须创建如下元数据类:

public class StudentMetaData{
     [Display(name="First Name")]
     public string FirstName {get; set;}
}
现在,您可以更新edmx文件,而无需更改元数据类中的数据注释


目前使用内存,但EF类始终是部分的,因此请创建同一类的另一个部分实现,然后将接口和元数据类型绑定添加到该类中

// Entity Framework Model
public partial class User
{
    public string Email { get; set; }
    public string Password { get; set; }
}

// Your Interface with data annotations
public interface IUser
{
    [Required]
    string Email { get; set; }

    [Required]
    string Password { get; set; }
}

// Partial Model appling the interface to the entity model
[MetadataType(typeof(IUser))]
public partial class User : IUser
{
}

在这种方法下,将来,如果添加新的属性,您只需担心更新接口,但EF类始终是部分的,因此创建同一类的另一个部分实现,然后将接口和元数据类型绑定添加到该类

// Entity Framework Model
public partial class User
{
    public string Email { get; set; }
    public string Password { get; set; }
}

// Your Interface with data annotations
public interface IUser
{
    [Required]
    string Email { get; set; }

    [Required]
    string Password { get; set; }
}

// Partial Model appling the interface to the entity model
[MetadataType(typeof(IUser))]
public partial class User : IUser
{
}
在这种方法下,将来,您只需要担心在添加新属性时更新接口