类型X与导入的类型X冲突

本文关键字:类型 冲突 导入 | 更新日期: 2023-09-27 18:21:13

在实体框架(数据库优先)中,我试图向创建的类添加一些数据注释。

一般来说:我创建了类X:

namespace Info
{
    using System;
    using System.Collections.Generic;
    public partial class X
    {
        public string SomeProperty {get; set;}
        ...
    }
}

我想在序列化为JSON时忽略SomeProperty,因此在App_Code/Metadata中,我创建了X.cs类,并添加了一些元数据:

namespace Info
{
    public class XMetaData
    {
        [JsonIgnore]
        public string SomeProperty{get; set;}
    }
     [MetadataType(typeof(XMetaData))]
     public partial class X
     {
     }
}

在上面,我手动将名称空间从Info.App_Code.Metadata更改为Info,以匹配分部类。

然而,在我使用X类的所有地方,我都有警告

The type Info.X in '.../Info/App_Code/Metadata/X.cs ' conflicts with the imported type Info.X in '.../Info/X.cs'. Using the type defined in '.../Info/App_Code/Metadata/X.cs '

我原以为两个分部类都会合并,但所有出现的都是指空的一个X类。

有人知道我缺了什么吗?

类型X与导入的类型X冲突

引用同一类的多个分部类定义必须全部存在于一个程序集中。在上面的例子中,在编译过程中,元数据应该烘焙到类中,编译后,类是完整的,由所有部分组成。分部类是将同一类的定义拆分为多个文件的一种方法。

请参阅此处以获得详尽的解释,但请注意以下内容:

所有属于同一类型的部分类型定义必须在同一程序集和同一模块(.exe或.dll文件)中定义。分部定义不能跨越多个模块。

此处的链接解释了

通常,ASP.NET为每个应用程序目录(如App_Code)创建一个程序集,并为主目录创建一个。

对于您的情况,尽管分部类在相同的项目中,但它们并没有被编译到相同的程序集中。

根据您正在开发的应用程序类型,将代码放在App_code文件夹中可能是错误的,因为它会对内容产生某些影响。请参阅其他问题。

尝试将源文件移出App_Code,并确保其"构建操作"在属性窗口中为"编译"。

删除项目bin文件夹,清理并重建项目

我遇到了同样的问题。可以用两种方法解决这个问题。1.重命名App_Code文件夹2.将.cs文件移动到项目的根目录中。

这两种方法都有效。

在我的案例中,我通过在APP_Code文件夹中创建一个子文件夹来解决这个问题。已将源代码移到那里。添加了一个深度命名空间。清理和构建,现在一切正常。

尝试检查.aspx页面是否与类(.cs)文件同名。

示例:如果文件为Guy.aspx,类文件为Guy.cos,则这两个文件将发生冲突。

检查.aspx文件的第一行,如果它Inherits="Guy",则存在冲突。不要忘记更改Guy.aspx.cs文件。如果该文件已经创建,则需要更改公共分部类。