Как обновить (путем слияния) edmx без переопределения классов моделей в asp. net mvc - PullRequest
1 голос
/ 22 января 2020

Я разрабатываю приложение в asp. net mvc. Я использую Entity Framework в качестве ORM. У меня проблема. Чтобы использовать javascript ненавязчивую проверку, мне нужно добавить аннотацию к объектам модели. Например; [Обязательно], [адрес электронной почты]. Но когда мы добавляем что-то в базу данных и обновляем ее, все классы моделей переопределяются, и все аннотации исчезают. Или, как только вы откроете edmx, автоматические классы модели c автоматически переопределятся. Как я могу решить эту проблему. Существуют десятки экранов и классов, малейшее изменение в 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; }
}
}

Правка для метаданных

Частичные опросы и метаданные

 //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; }
}

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);
        }
    }

Как мне изменить событие GetData. И какой список должен go на стороне клиента ??

Ответы [ 3 ]

0 голосов
/ 22 января 2020

Для этого вы можете использовать частичные классы и использовать "ModelMetadataType" в. net основной аннотации над вашим классом. давайте сделаем это в коде: это ваша модель, созданная в edmx:

public partial class Student{
     public string FirstName {get; set;}
}

Прежде всего вам нужно создать частичный класс в другом файле с тем же именем, что и у студенческого класса, и быть осторожным с его пространством имен. должен быть таким же, как и выше класса. (классы должны быть вне файла edmx)

[ModelMetadataType(typeof(StudentMetaData))]
public partial class Student{

}

и в конце вы должны создать свой класс метаданных следующим образом:

public class StudentMetaData{
     [Display(name="First Name")]
     public string FirstName {get; set;}
}

теперь вы можете обновить свой файл edmx без изменения аннотации данных в ваших классах метаданных.

https://docs.microsoft.com/en-us/dotnet/api/system.componentmodel.dataannotations.metadatatypeattribute?view=netframework-4.8

0 голосов
/ 22 января 2020

Работает из памяти в данный момент, но классы EF всегда являются частичными, поэтому создайте еще одну частичную реализацию того же класса, а затем добавьте привязку Interface и Metadatatype к этому.

// 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
{
}

При таком подходе в будущем вам нужно беспокоиться только об обновлении интерфейса, если вы добавите новые свойства

0 голосов
/ 22 января 2020

Рекомендуется использовать ViewModel [не классы Entity / Model] для манипулирования / воспроизведения на стороне клиента.

Поэтому используйте ViewModel, классы Inherit Model, а затем используйте аннотации, например, для. Publi c class ViewModelClass: ModelClass {[Обязательный («Имя обязательно»)] Publi c String FirstName {get; set;}}

...