Первые обновления конструктора модели в базе данных MVC 4 EF

Я создал приложение MVC 4 с EF db-first, используя модель данных объекта ADO.NET.

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

Использование Metadata.cs и PartialClasses.cs из http://www.asp.net/mvc/tutorials/mvc-5/database-first-development/enhancing-data-validation Я не уверен, что это лучший способ обновить конструкторы по умолчанию для этих классов моделей. .

Вот пример модели, упрощенный. Внутри .edmx

public partial class Campaign
{
    public Campaign()
    {
        this.Fees = new HashSet<Fee>();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    public string CreatedBy { get; set; }
    public System.DateTime CreatedOnDate { get; set; }

    public virtual ICollection<Fee> Fees { get; set; }
}

в ParticalClasses.cs [ошибки, поскольку сгенерированный модальный класс определяет конструктор по умолчанию]

[MetadataType(typeof(CampaignMetadata))]
public partial class Campaign
{
    public Campaign()
    {
        this.Fees = new HashSet<Fee>();

        // Non-Generated 
        this.CreatedOnDate = DateTime.Now;
    }
}

У меня есть другие модели. Я также хотел бы иметь другие конструкторы с другими параметрами, поэтому, чтобы упростить мой вопрос, где я могу добавить конструкторы для DB первого MVC, чтобы не обновлять сгенерированные классы моделей?


person user3250366    schedule 19.05.2014    source источник
comment
вы можете применить проверку к своим моделям просмотра - та же концепция, что и к объектам модели данных.   -  person tintyethan    schedule 21.05.2014


Ответы (1)


Не на 100% уверен в том, что вы пытаетесь сделать, но я постараюсь ответить на ваш вопрос.

Прежде всего, кажется, что вы упускаете смысл MVC: ваша ссылка относится к валидаторам модели просмотра, но вы говорите о моделях данных. Две ОЧЕНЬ разные вещи. В модели данных нечего проверять — они меняются и управляются тем, что происходит в базе данных.

Вот что я бы сделал:
1) Создайте уровень данных: он будет содержать все ваши классы сущностей.
2) Создайте уровень обслуживания: это создаст экземпляры и заполнит классы сущностей, используя либо необработанный sql, или шаблон (шаблон репозитория, например). 3) Создайте свой веб-сайт: на нем будут храниться ваши контроллеры, модели представлений (это те, которые вы хотите проверить) и представления.

Для вашего класса Campaign:

public interface IEntity
{
   object EntityID { get; set; }
}

public abstract class BaseEntity: IEntity
{
   public abstract object EntityID { get; set; }
}

public class Campaign : BaseEntity
{
   #region Properties

   public int ID { get; set; }

   public string Name { get; set; }

   public string CreatedBy { get; set; }

   public DateTime CreatedOnDate { get; set; }

   public virtual List<Fee> Fees { get; set; }

   #endregion

   #region BaseEntity Implementation

   public override object EntityID
   {
       get { return this.ID; }
   }

   #endregion   

   #region Constructors

   public Campaign()
   {
      this.CreatedOnDate = DateTime.Now;
      this.Fees = new List<Fee>();
   }

   #endregion
}

//View model
//THIS is the class you want to validate
public class CampaignViewModel
{
   #region Properties

   public int ID { get; set; }

   [StringLength(50)]
   public string Name { get; set; }

   [Required]
   public string CreatedBy { get; set; }

   public DateTime CreatedOnDate { get; set; }

   public Fee AssociatedFee { get; set; } 

   #endregion

   #region Constructors

   public CampaignViewModel() 
   { }

   public CampaignViewModel(Campaign data)
   {
      this.ID = data.ID
      this.Name = data.Name;
      this.CreatedBy = data.CreatedBy;
      this.CreatedOn = data.CreatedOn;
      this.AssociatedFee = data.Fees.Where(x=>x.Active && x.ID == this.ID);
      //Just an example
   }

   #endregion
}

Кроме того, вы можете использовать Fluent Validation для более глубокого разделения задач. (http://fluentvalidation.codeplex.com/)

person Lucian    schedule 19.05.2014