Возникли проблемы с MetadataType, Annotations и EF - PullRequest
0 голосов
/ 23 ноября 2010

Я пытаюсь использовать аннотации данных для проверки моделей Entity Framework с использованием частичных классов.

В этой статье (MSDN) мне сказали, что частичный класс должен находиться в том же пространстве имен, что и модель данных. Моя модель данных находится в EntityFrameworkDataProvider, поэтому мой частичный класс, который находится в MyApp.Backend.Models, выглядит следующим образом:

using System.ComponentModel.DataAnnotations;

namespace EntityFrameworkDataProvider
{
    [MetadataType(typeof(ItemMetaData))]
    public partial class Item { }

    public class ItemMetaData
    {
        [ScaffoldColumn(false)]
        public object CreateDate { get; set; }

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

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

Я проверяю модель в моем классе контроллера следующим образом:

[HttpPost]
public ViewResult Edit(Item item)
{
    if (!TryUpdateModel(item))
    {
        return View(item);
    }

    return View("Details", item);
}

Компилируется без ошибок. Однако при попытке отредактировать элемент я получаю эту ошибку:

Сообщение об ошибке компилятора: CS0433: тип 'EntityFrameworkDataProvider.Item' существует как в 'long-path.DLL', так и 'long-path.DLL'

Полагаю, класс Item компилируется дважды или что-то в этом роде. Как предотвратить эту ошибку?

1 Ответ

2 голосов
/ 23 ноября 2010

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

[HttpPost]
public ViewResult Edit(Item item)
{
    if (!ModelState.IsValid)
    {
        return View(item);
    }
    return View("Details", item);
}

Что касается сообщения об ошибке компилятора, вы не предоставили достаточно информации, чтобы я мог вам помочь. Убедитесь, что этот класс Item не определен в разных местах и ​​что он действительно partial в каждом отдельном файле .cs, с которым вы сталкиваетесь. Я подозреваю, что где-то у вас есть определенный класс Item, который не является частичным. Также следует помнить, что если этот класс Item определен в отдельной сборке, даже если он помечен как частичный, после компиляции понятие частичного больше не существует. Частичные классы работают только в одной сборке.

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