Ogglas
Ogglas

Reputation: 70146

Entity Framework 6 - Removed default discriminator column for inherited abstract class - error 3032: Problem in mapping

Error:

error 3032: Problem in mapping fragments starting at line: Condition member '' with a condition other than 'IsNull=False' is mapped. Either remove the condition on or remove it from the mapping.

Code:

public enum MyEnum
{ 
    Value1, Value2
}

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

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

    public string MyDerivedOneString { get; set; }
}

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

public class MyDbContext : DbContext
{
    DbSet<MyBaseClass> MyBaseClass { get; set; }

    DbSet<DerivedOne> DerivedOne { get; set; }

    DbSet<DerivedTwo> DerivedTwo { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<MyBaseClass>()
            .Map<DerivedOne>(x => x.Requires("MyEnum").HasValue((int)MyEnum.Value1))
            .Map<DerivedTwo>(x => x.Requires("MyEnum").HasValue((int)MyEnum.Value2));
    }
}

static void Main(string[] args)
{
    var db = new MyDbContext();

    var derivedOne = new DerivedOne();

    derivedOne.MyDerivedOneString = "test";

    db.DerivedOne.Add(derivedOne);
    //Exception
    db.SaveChanges();
}

Upvotes: 0

Views: 613

Answers (1)

Ogglas
Ogglas

Reputation: 70146

https://learn.microsoft.com/en-us/aspnet/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-inheritance-with-the-entity-framework-in-an-asp-net-mvc-application

Solved it like this, it was a table-per-hierarchy (TPH) inheritance error:

Classes not shown are not edited.

public abstract class MyBaseClass
{ 
    [NotMapped]
    public MyEnum MyEnum { get; protected set; }
}

public class MyDbContext : DbContext
{
    DbSet<MyBaseClass> MyBaseClass { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Entity<MyBaseClass>()
            .Map<DerivedOne>(x => x.Requires("MyEnum").HasValue((int)MyEnum.Value1))
            .Map<DerivedTwo>(x => x.Requires("MyEnum").HasValue((int)MyEnum.Value2));
    }
}

static void Main(string[] args)
{
    var db = new MyDbContext();

    var derivedOne = new DerivedOne();

    derivedOne.MyDerivedOneString = "test";

    db.MyBaseClass.Add(derivedOne);

    db.SaveChanges();

    var test = db.MyBaseClass.OfType<DerivedOne>().FirstOrDefault();
}

Upvotes: 2

Related Questions