c# - Entity Framework 模型-第一个枚举类型元数据类型

标签 c# entity-framework ef-model-first

我知道在进行模型优先开发时,您可以使用由 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
    }
}

最佳答案

您需要为枚举禁用代码生成。您可以通过引用外部类型来做到这一点。

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

Model Browser

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

Add New Enum Type

最后将您的枚举类型命名为 ContactType 并勾选 Reference External type,此处完全限定您创建的自定义枚举,如我之前所示。例如。 YourEnumNamespace.ContactType.

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

New Enum

最后,在您希望使用自定义枚举的 edmx 文件中的实体中,选择您想要与自定义枚举一起使用的属性,在本例中我将其命名为 MyContactTypeProperty

Entity with Property

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

enum property

好了。无需费力地尝试声明部分枚举等,因为您不能拥有部分枚举。无论如何,这将做你需要的。祝你好运!

关于c# - Entity Framework 模型-第一个枚举类型元数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25332834/

相关文章:

entity-framework - SQL 方言实际上如何在 hibernate 和 JOOQ 等框架中内部工作

entity-framework - 如何通过 EF Model First 数据库架构升级避免数据丢失?

c# - 保存时如何自动更新 Entity Framework 4 中实体的 Modified 属性?

c# - 这个加密的 QueryString 有什么问题 - Base-64 字符数组的长度无效

c# - Visual Studio 2015 社区 : PNG Editor Error - "Exception from HRESULT: 0x80020101"

jquery - 创建新的 MVC 项目时出错 - EF 和 JQuery

.net - 生成数据库 - 没有执行 SQL 选项?

c# .NET 2.0 缩放滚动条

c# - 使用 Azure 存储客户端库 v2 的共享访问签名出现 404 错误

c# - IQueryable<T> 没有获取导航属性