【问题标题】:Having some troubles with MetadataType, Annotations and EFMetadataType、Annotations 和 EF 有一些问题
【发布时间】:2010-11-22 21:52:53
【问题描述】:

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

我在这个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 类被编译了两次或什么的。应该如何防止这个错误?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 当然,这可能是正确的,但它不会改变两个程序集“碰撞”的事实。不过,为小费 +1。
    • 这个Item 类是否有可能在单独的程序集中定义,并且我的意思是与包含您发布的代码的程序集不同?
    • 这是 2 个项目... EntityFrameworkDataProvider.Item 和 MyApp.Backend.Models (asp.net mvc app)。不确定是否单独的项目 == 单独的程序集?
    • 是的,它是单独的组件。这解释了错误消息。您只能在同一个项目中拥有部分类。一旦编译,它们就不再是部分的了。编译程序集中不存在分部类的概念。它只是为了允许您在多个源文件中拆分类的定义。因此,唯一可行的方法是将这个部分 Item 类定义放入另一个项目中。
    • 好的,但是没有解决方法吗?我无法在 web 项目中拥有模型......这根本没有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2019-10-28
    • 2019-09-12
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    相关资源
    最近更新 更多