2

为方便起见,我有几个带有嵌套枚举的参考实体。例如:

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+Values”类型和“StatusB+Values”类型都具有相同的简单名称“Values”,因此不能在同一模型中使用。给定模型中的所有类型都必须具有唯一的简单名称。在 Code First fluent API 中使用“NotMappedAttribute”或调用 Ignore 以从模型中显式排除属性或类型。

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

有没有其他方法可以从模型中排除这些枚举?

4

1 回答 1

2

如果您实际上包含该类型的属性,则应该仅在模型中获取枚举类型。如果你这样做,就不能忽略类型,而不忽略属性。并且测试表明,忽略属性就足以忽略类型。

这是一个最小的完整测试程序,用于获取您得到的异常:

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). 不过,根据您的需要,它可能已经足够好了。

于 2014-06-21T12:48:00.967 回答