我有以下内容(为清楚起见,已缩写):一个枚举,带有该枚举的基类,以及两个将枚举设置为特定值的派生类。

public enum MyEnum
{
    Value1, Value2
}

public class MyBaseClass
{
    public MyEnum { get; protected set; }
}

public class DerivedOne: MyBaseClass
{
    public DerivedOne { MyEnum = MyEnum.Value1; }
}

public class DerivedTwo: MyBaseClass
{
    public DerivedTwo { MyEnum = MyEnum.Value2; }
}

我想做的是让Entity Framework 5通过基于MyEnum值的区分符自动区分DerivedOne和DerivedTwo 。我应该能够做到这一点,因为按照惯例,每个MyEnum == MyEnum.Value1代表DerivedOne,而MyEnum == MyEnum.Value2代表DerivedTwo。

我在DbContext中尝试了此操作:
public class MyDbContext : DbContext
{
    DbSet<MyBaseClass> MyBaseClass { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MyBaseClass>()
                    .Map<DerivedOne>(m => m.Requires(x => x.MyEnum == MyEnum.Value1));

        base.OnModelCreating(modelBuilder);
    }
}

但是,这将引发以下InvalidOperationException:

表达式“x =>(Convert(x.MyEnum)== 0)”不是有效的属性表达式。表达式应表示一个属性(...)

编辑:我相信我可以使用以下方法:
modelBuilder.Entity<MyBaseClass>().Map<DerivedOne>(m => m.Requires("MyEnum")
                                  .HasValue((Int32)MyEnum.Value1));

现在,我得到这个EntityCommandCompilationException:

在映射从行(...)开始的片段时出现问题,映射了条件成员'MyBaseClass.MyEnum',条件为'IsNull = False'。删除MyBaseClass.MyEnum上的条件或将其从映射中删除。

关于如何解决此问题的任何提示?谢谢!

最佳答案

据我所知,你不能那样做。进行明确的Requires来指定区分符只是给它一个name-而不是将其连接到您的媒体资源。

据我所知,这总是会导致您所描述的错误(以后)。如果要指定鉴别符,它必须是“自动的”一个(至少我从来没有设法这样定义它)

但是您不需要真正的。 “枚举”和鉴别符是您返回的类型的built into-基于鉴别符值,EF/CF正在构造“Base”或“DerivedOne”或DerivedTwo。

因此,要实现您想要的功能,您可以执行以下操作...

public class MyBaseClass
{
    [NotMapped()]
    public virtual MyEnum MyEnum { get { return MyEnum.Base; } }
}

public class DerivedOne: MyBaseClass
{
    public string OneProp { get; set; }
    public override MyEnum MyEnum { get { return MyEnum.One; } }
}

public class DerivedTwo: MyBaseClass
{
    public string TwoProp { get; set; }
    public override MyEnum MyEnum { get { return MyEnum.Two; } }
}

或者只是改用is(如果它对您有用)...
if (entity is MyBaseClass) // instead of enum

或查询依据...
.OfType<MyBaseClass>();

关于c# - Entity Framework 5-派生类的基于枚举的区分符,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15859452/

10-13 03:15