如何忽略映射中的嵌套枚举
本文关键字:嵌套 枚举 何忽略 映射 | 更新日期: 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)
。不过,根据您的需要,它可能已经足够好了。