Аннотации данных не регенерируются в классе при перезагрузке модели - PullRequest
0 голосов
/ 24 мая 2018

Я разрабатываю веб-приложение, связанное с базой данных, используя MVC Pattern и EF 6.0.Чтобы убедиться, что данные, введенные в мое веб-приложение, верны, я хочу использовать аннотации данных.

Я следовал этому учебнику, но в данный момент я застрял в последней части.

Написано, что:

Добавление атрибутов проверки непосредственно в класс модели работает, когда вы не ожидаете, что база данных изменится;однако, если ваша база данных изменится и вам нужно будет обновить класс модели, вы потеряете все атрибуты, которые вы применили к классу модели.Этот подход может быть очень неэффективным и может привести к потере важных правил проверки.

Чтобы избежать этой проблемы, вы можете добавить класс метаданных, который содержит атрибуты.Когда вы связываете класс модели с классом метаданных, эти атрибуты применяются к модели.При таком подходе модельный класс может быть восстановлен без потери всех атрибутов, которые были применены к классу метаданных.

Поэтому я следовал инструкциям по созданию класса метаданных и частичных классов.

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

Предварительно обновленный / обновленный класс работает нормально.

После обновления класс, кажется, не применяет никаких ограничений, например, я могувставьте нового клиента в возрасте 11 лет, даже если значение не должно превышать 10.

Это мое предварительное обновление класса:

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

    public int IdClient { get; set; }

    public string FirstName { get; set; }
    [StringLength(50)] //data annotation for FirstName

    public string LastName { get; set; }
    [StringLength(50)] //data annotation for LastName

    public string Sex { get; set; }

    public int Height { get; set; }

    [Range(3,10)] // data annotation for Age
    public int Age { get; set; }

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

Это мое обновление после класса:

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

    public int IdClient { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Sex { get; set; }
    public int Height { get; set; }
    public int Age { get; set; }

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

это мой класс метаданных:

public class TaClientMetadata
{
    [StringLength(50)]
    [Display(Name = "First Name")]
    public string FirstName;

    [StringLength(50)]
    [Display(Name = "Last Name")]
    public string LastName;

    [Range(3, 10)]
    [Display(Name = "Age")]
    public int Age;
}

А это мой частичный класс:

public class PartialClasses
{
    [MetadataType(typeof(TaClientMetadata))]
    public partial class TaClient
    {
    }
}

Я, вероятно, что-то упустил, понял что-то.

1 Ответ

0 голосов
/ 24 мая 2018

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

[MetadataType(typeof(TaClientMetadata))]
partial class TaClient
{
}

Это должно быть определено непосредственно в пространстве имен.Это, однако, не то, что вы делаете.Вы определяете вложенный частичный класс в другом классе с именем PartialClasses.Хотя это скомпилируется нормально, вы получите два класса: TaClient (который создается автоматически) и PartialClasses.TaClient (который создан вами).

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

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