C# 实体框架模型第一个枚举类型MetadataType

C# 实体框架模型第一个枚举类型MetadataType,c#,entity-framework,ef-model-first,C#,Entity Framework,Ef Model First,我知道在使用model first开发时,可以使用t4模板生成的分部类来添加元数据。e、 g public partial class Address { public int Id { get; set; } public string Street1 { get; set; } public string Street2 { get; set; } public string City { get; set; } public stri

我知道在使用model first开发时,可以使用t4模板生成的分部类来添加元数据。e、 g

public partial class Address
{        
    public int Id { get; set; }
    public string Street1 { get; set; }
    public string Street2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
}
然后在另一个文件中,我执行以下操作:

[MetadataType(typeof(AddressMetadata))]
public partial class Address {
}

internal sealed class AddressMetadata {

    [Display(Name = "Street")]
    public string Street1 { get; set; }

    [Display(Name = "Street (cont.)")]
    public string Street2 { get; set; }

    [Display(Name = "Zip code")]
    public string Zip { get; set; }
}
我正在尝试对EDMX文件中定义的枚举类型执行此操作

// this doesn't work
[MetadataType(typeof(ContactTypeMetadata))]
public enum ContactType {

}

public class ContactTypeMetadata {
}
执行此操作时,会出现以下错误:

Error   1   The namespace 'Models' already contains a definition for 'ContactType'
在模型优先项目中,枚举是否有与类相同的功能

编辑

在EDMX文件中,我定义了一个枚举类型:

namespace WindowsFormsApplication1
{
    using System;

    public enum ContactType : int
    {
        CEO = 0,
        CIO = 1,
        Peasant = 2
    }
}
我正试图找到一种方法,使用类似的机制(在单独的文件中,这样如果我修改EDMX,我的更改就不会被覆盖)来实现这一点:

namespace WindowsFormsApplication1
{
    using System;

    public enum ContactType : int
    {
        [Display(Name="Chief Executive Officer")]
        CEO = 0,

        [Display(Name="Chief Information Officer")]
        CIO = 1,

        [Display(Name="Regular Employee")]
        Peasant = 2
    }
}

您需要禁用枚举的代码生成。可以通过引用外部类型来执行此操作

在.edmx之外创建枚举。例如。 ContactType.cs位于项目的根目录中,但只要知道它位于哪个命名空间中,就可以将其放置在任何位置

从已创建的edmx枚举中复制当前代码,并将其粘贴到新创建的ContactType.cs文件中,如下所示

联系人类型

using System;
namespace YourEnumNamespace
{
    public enum ContactType : int
    {
        [Display(Name="Chief Executive Officer")]
        CEO = 0,

        [Display(Name="Chief Information Officer")]
        CIO = 1,

        [Display(Name="Regular Employee")]
        Peasant = 2
    }
}
现在,在.edmx模型中删除现有的ContactType枚举,该枚举位于模型浏览器的枚举类型部分下,只需选择它并删除它

返回到解决方案浏览,打开edmx并右键单击某个位置,然后单击“添加新的”,然后单击“枚举类型”

最后,命名您的枚举类型ContactType和tick Reference External type,这里完全限定您创建的自定义枚举,如我前面所示。例如,YourEnumNamespace.ContactType

这会告诉edmx使用外部枚举,而不是在edmx本身中生成枚举代码

最后,在edmx文件中要使用自定义枚举的实体中,选择要与自定义枚举一起使用的属性,在本例中,我称之为MyContactTypeProperty

并将属性类型更改为自定义枚举


就这样。不需要到处尝试声明部分枚举之类的东西,因为记录不能有部分枚举。无论如何,这会满足你的需要。祝你好运

我的王国是能够完成部分枚举的…MetadataTypeAttribute看起来甚至不能应用于枚举,只能应用于类。问题不仅仅是拥有“部分”枚举的能力。@MerickOWA我只是希望有一种类似的机制,我就是找不到。那么也许你应该确切地描述一下你想要在这些枚举上使用什么类型的“元数据”。就目前而言,我不知道你想要实现什么。我编辑了原始帖子@MerickOWAI,但我从来不知道我能做到。这是完美的@CapTec!!非常感谢你!我要到明天下午才能赏金。但很明显,这是你的(我能说的很少:)没问题。我知道这是怎么回事,你不知道你不知道的!这就是堆栈溢出的好处所在。很高兴我能帮上忙。是的,回答得很好,比我想的破解T4模板生成器要好得多。