Entity Framework模型优先枚举类型MetadataType

4

我知道在使用模型优先开发时,可以使用由T4模板生成的部分类来添加元数据。例如:

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
    }
}

我的王国可以换取能够进行部分枚举的能力... - Dan Champagne
MetadataTypeAttribute 看起来甚至不能应用于枚举,只能应用于类。存在的问题不仅仅是能否拥有“部分”枚举。 - MerickOWA
@MerickOWA 我只是希望有一个类似的机制存在,但我找不到。 - Dan Champagne
那么也许你应该描述一下你想在这些枚举上拥有什么样的“元数据”。就目前而言,我不知道你想要实现什么。 - MerickOWA
我编辑了原始帖子@MerickOWA。 - Dan Champagne
1个回答

11

你需要禁用枚举类型的代码生成。你可以通过引用外部类型来实现。

在 .edmx 文件之外创建一个枚举类型,例如在项目的根目录下创建 ContactType.cs 文件,当然你可以将它放在任何你喜欢的地方,只要你知道它所在的命名空间即可。

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

ContactType

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枚举,它位于“枚举类型”部分下的模型浏览器中,只需选择它并将其删除。

Model Browser

返回解决方案浏览器,在edmx上右键单击某处,然后单击“添加新项”,然后单击“枚举类型”。

Add New Enum Type

最后,将枚举类型命名为ContactType,并选中“引用外部类型”,在此完全限定您所创建的自定义枚举。例如:YourEnumNamespace.ContactType。

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

New Enum

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

Entity with Property

将属性类型更改为您的自定义枚举。

enum property

就这样了,无需尝试声明部分枚举之类的东西,记录一下,您不能拥有部分枚举。 无论如何,这将满足您的需要。 祝你好运!


我从未想过我能做到这一点。这太完美了@CapTec!!非常感谢你! - Dan Champagne
我明天下午才能授予悬赏,但很明显是你的(尽管我只能提供一点点帮助 :)) - Dan Champagne
没问题。我知道这种感觉,你不知道自己不知道什么!这就是 Stack Overflow 的好处所在。很高兴能帮到你。 - Daniel Lane
是的,非常好的答案,比我想要修改 T4 模板生成器要好得多。 - MerickOWA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接