Обновить модель из базы данных (сначала база данных) - PullRequest
6 голосов
/ 20 июля 2011

Я использую MVC3 VS2010 с EF4.1, я создал свою БД с помощью SQL Server и импортирую ее в веб-приложение MVC3.

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

Есть ли возможность обновить модель из базы данных без потери информации о моделях?

ИЛИ

где мне определять валидацию на моих моделях вместо непосредственного использования файлов моделей?

Ответы [ 4 ]

11 голосов
/ 20 июля 2011

Обновление: Поскольку это все еще относительно популярно, я создал пост в блоге по этому вопросу.

http://jnye.co/Posts/19/adding-validation-to-models-created-by-entity-framework-database-first-c

Если вы хотите проверить свои модели,и не используйте viewModels, используйте частичные классы для определения атрибутов проверки.Например:

Скажем, у вас есть модель типа

public class User {
    public string Name { get; set; }
}

Если вы хотите добавить в нее валидатор длины строки, вам нужно создать частичный класс и использовать MetadataTypeAttribute (это находится в System.ComponentModel.DataAnnotations)

Следующие классы должны быть определены в их отдельном файле, NOT , помещенном в тот же файл, что и ваши автоматически созданные модели.*

Затем вы определяете свою валидацию в классе UserMetadata следующим образом

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

РЕДАКТИРОВАТЬ

Я только что нашел эту статью, которая объясняет решение чуть более подробно http://themonitoringguy.com/tips-tricks/validating-microsoft-entity-framework-objects-c-mvc/

3 голосов
/ 20 июля 2011

Нет, файлы будут обновляться каждый раз.

Все классы определены как частичные, поэтому вы можете легко добавлять DataAnnotations с помощью MetadataTypeAttribute.

Допустим, у вас есть класс User, определенный следующим образом:

public partial class User {
    public string Name {get;set;}
}

Создать IUser интерфейс

public interface IUser {
   [Required]
   [DisplayName("User name")]
   string Name {get;set;}
}

А затем расширить класс User, указав, что IUser будет использоваться в качестве метаданных.

[MetadataType(typeof(IUser))]
public partial class User {} //Empty class body
1 голос
/ 06 февраля 2019

Проверьте, что пространство имен MainClass совпадает с Partial и имеет те же атрибуты. Это мое решение.

пример:

Метаданные: создавайте это везде, где хотите

public class FormMetadata
{
    public int Id { get; set; }
    public string Description { get; set; }
    public Nullable<bool> IsEnable { get; set; }
    public Nullable<System.DateTime> CreationDate { get; set; }
    public int CompanieId { get; set; }
    public string RegularExpression { get; set; }

    public virtual ICollection<Field> Fields { get; set; }
    [JsonIgnore]
    public virtual Company Company { get; set; }
}

MainClass

namespace Transactions.Model
{
  public partial class Form
  {
      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
      public Form()
      {
          this.Fields = new HashSet<Field>();
      }  
      public int Id { get; set; }
      public string Description { get; set; }
      public Nullable<bool> IsEnable { get; set; }
      public Nullable<System.DateTime> CreationDate { get; set; }
      public int CompanieId { get; set; }
      public string RegularExpression { get; set; }
      [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
      public virtual ICollection<Field> Fields { get; set; }
      public virtual Company Company { get; set; }
  }
}

Частично для использования типа метаданных

namespace Transactions.Model
{
    [MetadataTypeAttribute(typeof(FormMetadata))]
    public partial class Form
    {
    }
}

Если у вас есть проблемы с созданием частичного класса в том же пространстве имен? Не волнуйся:

  1. Создать папку
  2. Создать частичный класс в этой папке
  3. Изменить пространство имен на то же, что и MainClass
1 голос
/ 20 июля 2011

Первое правило любого дизайнера таково: он генерирует любой код, который нельзя изменить, поскольку он будет полностью удален при следующем обновлении чего-либо в конструкторе.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...