遇到MetadataType,Annotations和EF的麻烦

时间:2010-11-22 21:52:53

标签: .net asp.net asp.net-mvc entity-framework asp.net-mvc-3

我正在尝试使用数据注释来使用分部类来验证我的实体框架模型。

我在这个article (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:'long-path.DLL'和'long-path.DLL'中都存在'EntityFrameworkDataProvider.Item'类型

我猜Item类正在编译两次或者其他什么。如何防止这种错误?

1 个答案:

答案 0 :(得分:2)

您的控制器操作错误。您永远不应在同一类型上使用操作参数和TryUpdateModel,因为它会在模型​​状态下插入错误消息两次。你的行动应该是这样的:

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

至于您收到的编译器错误消息,您没有提供足够的信息,以便我可以帮助您。确保此Item类未在不同位置定义,并且在您遇到它的每个partial文件中确实.cs。我怀疑你定义的Item类的某个地方并不偏袒。您应该注意的是,如果此Item类在单独的程序集中定义,即使它被标记为partial,一旦编译,部分的概念就不再存在。部分类仅在同一个程序集中起作用。