Данные метаданных MVC C # Путаница аннотаций - PullRequest
0 голосов
/ 16 октября 2018

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

При обновлении или регенерации класса модели он создает / обновляет DatabaseModel.edmx > DatabaseModel.tt автоматически сгенерированными классами tablename.cs.Я не могу их редактировать, если не хочу потерять атрибуты проверки.

Согласно документации Microsoft , я создал классы Metadata.cs и Partial.cs в папке Model.или даже пытался создать класс для таблицы базы данных, используя следующий пример кода:

using System;
using System.ComponentModel.DataAnnotations;

namespace CApp.Models
{

    [MetadataType(typeof(ConsultantMetaData))]
    public partial class Consultant
    {
    }
    public class ConsultantMetaData
    {
        [Required]
        [Display(Name = "Name")]
        public string ConsultantName { get; set; }

        [Required]
        [EmailAddress]
        [Display(Name = "Email")]
        public string ConsultantEmail { get; set; }

        [Required]
        [Display(Name = "Is Active")]
        public bool IsActive { get; set; }
    }
}

И вот тогда я начинаю получать ошибки неоднозначности.

«Консультант» является неоднозначнымссылка между 'CApp.Data.Consultant' и 'CApp.Models.Consultant'

Подмодель по умолчанию, создающий контроллер Index, Details, Create, Edit и Delete и последующие виды, затрагивается.По умолчанию все они используют автоматически сгенерированный код классов моделей для получения и установки данных.

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include ="ConsultantId,ConsultantName,ConsultantEmail,IsActive")] Consultant consultant)
{
    if (ModelState.IsValid)
    {
        db.Consultants.Add(consultant);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

    return View(consultant);
}

Или:

// GET: Consultants/Edit/5
public ActionResult Edit(int? id)
{
    if (id == null)
    {
        return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
    }
    Consultant consultant = db.Consultants.Find(id);
    if (consultant == null)
    {
        return HttpNotFound();
    }
    return View(consultant);
}

Я получу неявную ошибку преобразования:

Невозможно неявно преобразовать тип 'CApp.Data.Consultant' в 'CApp.Models.Consultant'

В методе, если я изменю Консультанта на:

CApp.Data.Consultant consultant = db.Consultants.Find(id);

Затем данные получаются обычным образом, а атрибут проверки отображения игнорируется и по-прежнему отображает имя столбца таблицы вместо требуемого атрибута отображаемого имени.

Не уверен, как мне следует извлечь и отобразить модельданные, чтобы он отображал информацию, которая мне нужна, кроме того, чтобы вручную ввести имя нужного столбца в представлении, которое не является целью.Мне кажется, что я бегаю кругами здесь, и я еще не нашел нужного мне ответа на этом форуме.

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

Любая помощь будет оценена.Крайне нуждаюсь в объяснении с примерами, пожалуйста.

1 Ответ

0 голосов
/ 16 октября 2018

Кажется, у вас есть класс консультанта в CAmap.Data namesmap, когда вы пытаетесь добавить метаданные в пространство имен CApp.Models!

, вам следует рассмотреть возможность использования тех же пространств имен.Вам нужно изменить CApp.Models на CApp.Data (или другим способом, но я не рекомендую).

Ваше первоначальное определение для Консультанта должно быть:

namespace CApp.Data
{
    public partial class Consultant
    {
        // some codes
    }
}

Обратите внимание, чтооригинальное определение класса должно быть также частичным .Тогда ваши метаданные должны находиться в том же пространстве имен:

using System;
using System.ComponentModel.DataAnnotations;

namespace CApp.Data
{

    [MetadataType(typeof(ConsultantMetaData))]
    public partial class Consultant
    {
    }
    public class ConsultantMetaData
    {
        [Required]
        [Display(Name = "Name")]
        public string ConsultantName { get; set; }

        [Required]
        [EmailAddress]
        [Display(Name = "Email")]
        public string ConsultantEmail { get; set; }

        [Required]
        [Display(Name = "Is Active")]
        public bool IsActive { get; set; }
    }
}
...