如何忽略映射中的嵌套枚举

本文关键字:嵌套 枚举 何忽略 映射 | 更新日期: 2023-09-27 18:09:35

为了方便,我使用了几个嵌套枚举的引用实体。例如:

public class StatusA
{
    public enum Values
    {
        Active = 1,
        Inactive = 2,
        InProgress = 3
    }
}
public class StatusB
{
    public enum Values
    {
        Sent = 1,
        Accepted = 2,
        Expired = 3
    }
}
public class EntityA
{
    public StatusA.Values Status {get; set;}
}
public class EntityB
{
    public StatusB.Values Status {get; set;}
}

我在模型配置时得到以下例外:类型"StatusA+值"和类型"StatusB+值"都具有相同的简单名称"值",因此不能在同一模型中使用。给定模型中的所有类型必须具有唯一的简单名称。在Code First流畅API中使用'NotMappedAttribute'或调用Ignore来显式地从模型中排除属性或类型。

试图修复它,我发现NotMappedAttribute不适用于枚举。我还尝试了流畅的API .Ignore<T>(也需要ref类型,而不是enum)和.Ignore(IEnumerable<Type>),但没有运气。谷歌搜索也不是很有帮助。

是否有其他方法从模型中排除这些枚举?

如何忽略映射中的嵌套枚举

您应该只在您的模型中获得枚举类型,如果您实际上包含了该类型的属性。如果这样做,就不能在不忽略属性的情况下以任何方式忽略类型。测试表明,忽略属性也足以忽略类型。

这里有一个最小的完整的测试程序来获得你得到的异常:

using System.Data.Entity;
using System.Data.Entity.Infrastructure;
public class A
{
    public int Id { get; set; }
    public E P { get; set; } // #1
    public enum E { }
}
public class B
{
    public int Id { get; set; }
    public E P { get; set; } // #2
    public enum E { }
}
static class Program
{
    static void Main()
    {
        var modelBuilder = new DbModelBuilder(DbModelBuilderVersion.Latest);
        modelBuilder.Entity<A>();
        modelBuilder.Entity<B>();
        var model = modelBuilder.Build(new DbProviderInfo("System.Data.SqlClient", "2012"));
    }
}

很明显,只要#1和#2都是模型的一部分,您就无法避免映射枚举类型。如果你删除#1或#2(或两者),或者用NotMapped属性标记它们,你会看到你不再得到你现在得到的异常。

如果可以避免映射枚举类型的属性,则可以避免重命名枚举类型,如下所示:

public class A
{
    public int Id { get; set; }
    public int PAsInt { get; set; }
    [NotMapped]
    public E P {
        get { return (E) PAsInt; }
        set { PAsInt = (int) value; }
    }
    public enum E { }
}

这是在EF完全不支持枚举类型时需要的旧方法。不幸的是,这种方法意味着查询context.As.Where(a => a.P == E.C)不能工作,因为模型不知道P属性。它需要写成context.As.Where(a => a.PAsInt == (int)E.C)。不过,根据您的需要,它可能已经足够好了。