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

el *_*vis 5 c# entity-framework partial-classes data-annotations

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

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

namespace Info
{
    using System;
    using System.Collections.Generic;

    public partial class X
    {
        public string SomeProperty {get; set;}
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望SomeProperty在序列化为JSON时忽略属性,因此在App_Code/Metadata创建类X.cs时我添加了一些MetaData:

namespace Info
{

    public class XMetaData
    {
        [JsonIgnore]
        public string SomeProperty{get; set;}
    }

     [MetadataType(typeof(XMetaData))]
     public partial class X
     {

     }

}
Run Code Online (Sandbox Code Playgroud)

上面我手动更改了命名空间,Info.App_Code.MetadataInfo使部分类匹配.

但是在我使用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类.

有人知道我错过了什么吗?

小智 7

根据您正在开发的应用程序类型,将代码放在App_Code文件夹中可能是错误的,因为它对内容有一定的影响.看到这个其他问题.

尝试将源文件移出App_Code,并确保它们的"构建操作"在属性窗口中为"已编译".


quj*_*jck 6

引用同一个类的多个部分类定义必须都存在于单个程序集中.在上面的示例中,在编译期间,元数据应该被烘焙到类中,并且在编译之后,类是完整的,包括所有部分.部分类是将同一类的定义拆分为多个文件的一种方法.

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

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

这里的链接解释了这一点

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

对于您的情况,虽然部分类在同一个项目相同的命名空间中,但它们不会被编译到同一个程序集中.