简体   繁体   中英

EntityFramework Code First inheritance with custom discriminator

I'm trying to map the following inheritance in EntityFramework Code First

public class Member
{
    public string ProjectName { get; set; }
    public string AssemblyName { get; set; }
    public string NamespaceName { get; set; }
    public string TypeName { get; set; }
    public string Signature { get; set; }
    public string DisplayName { get; set; }
    public MemberType Type { get; set; }
    public string Summary { get; set; }
    public bool IsStatic { get; set; }
    public bool IsInherited { get; set; }

    //public virtual Type ParentType { get; set; } // ignore this
}

public class Field : Member
{
    public string ValueType { get; set; }
    public bool IsReadOnly { get; set; }
    public bool IsVolatile { get; set; }
}

public enum MemberType
{
    Constructor,
    Field,
    Method,
    Operator,
    Property
}

As you can probably guess from the code, in time I plan to add more subclasses of Member (named Constructor, Method, Operator and Property), but first I'd just like to get the Field one to work properly.

My mapping-code looks like this

modelBuilder.Entities<Member>().Configure(config =>
{
    config.HasKey(m => new { m.ProjectName, m.AssemblyName, m.NamespaceName, m.TypeName, m.Signature });
    config.Property(m => m.DisplayName).IsRequired();
    config.ToTable("Members");
});

modelBuilder.Entities<Field>().Configure(config =>
{
    config.HasKey(f => new { f.ProjectName, f.AssemblyName, f.NamespaceName, f.TypeName, f.Signature });
});

modelBuilder.Entity<Member>()
    .Map<Field>(m => 
    {
        m.ToTable("Fields");
        m.Requires("Type").HasValue((int)Service.DataTypes.MemberType.Field).IsRequired();
    }); // note: realy not certain about this one

What I would like, is to generate two tables. One named "Members", and one named "Fields", and use the Type -property in the Member -class as a discriminator, and I'm sure I'm just doing something really stupid here, but I cannot for the life of me figure out how to do it. Because with the current code, it generates a column in the "Fields" table named "Type", which you obviously wouldn't need as that'd be a constant.

So I'm just wondering, could somebody please tell me what on earth I'm doing wrong?

Is there a typo there ? Your Class has a field Valuetype Not Type.

I have never tried with with JUST 1 mapping, try with a second table to make sure.

modelBuilder.Entity<Member>()
.Map<Field>(m => 
{
    m.ToTable("Fields");
    m.Requires("ValueType").HasValue((int)Service.DataTypes.MemberType.Field).IsRequired();
})
.Map<SECONDTYPE>(m =>
{
    m.Requires("ValueType").HasValue(42);
}); 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM