Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inherit a common base class in EF code first

I'm converting my EF POCO project to Code first. I had changed the T4 template, so that all my entities use a base class, EntityBase, that provides them with some common functionality that is not persistence related.

If I use [NotMapped] attribute on EntityBase, all entities inherit this attribute and I get a The type 'X.X.Person' was not mapped, for any type I try to use with EF.

If I use [NotMapped] on all properties of EntityBase, I get a EntityType 'EntityBase' has no key defined. Define the key for this EntityType exception

FYI: I use Ef 4.3.1

Edit: part of the code:

[DataContract(IsReference = true)]
public abstract class EntityBase : INotifyPropertyChanged, INotifyPropertyChanging
{
    [NotMapped]
    public virtual int? Key
    {
        get { return GetKeyExtractor(ConversionHelper.GetEntityType(this))(this); }
    }
    //other properties and methods!
}

and then

[DataContract(IsReference = true), Table("Person", Schema = "PER")]
public abstract partial class Person : BaseClasses.EntityBase, ISelfInitializer
{
    #region Primitive Properties
    private int? _personID;
    [DataMember,Key]
    public virtual int? PersonID
    {
        get{ return _personID; }
        set{ SetPropertyValue<int?>(ref _personID, value, "PersonID"); }
    }
}

For these two classes there is not fluent api configuration.

like image 391
Alireza Avatar asked Aug 27 '12 12:08

Alireza


People also ask

Which of the following are inheritance strategies can be used with EF Code First?

Inheritance with EF Code First: Table per Hierarchy (TPH)

How does EF support inheritance?

By default, EF maps the inheritance using the table-per-hierarchy (TPH) pattern. TPH uses a single table to store the data for all types in the hierarchy, and a discriminator column is used to identify which type each row represents.

Which of the following inheritance hierarchy is support in EF core?

This tutorial demonstrates how to implement TPH inheritance. TPH is the only inheritance pattern that the Entity Framework Core supports.


2 Answers

Try to define EntityBase as abstract, if it's possible for you, and put NotMapped... on the properties you don't want to map should do the trick.

like image 172
Raphaël Althaus Avatar answered Nov 12 '22 14:11

Raphaël Althaus


Are you trying to create a table of EntityBase (Great blog post about this : Table Per Type Inheritence) that all your entities share, or to simply create a base object so all your entities can use the same methods? I didn't have any problem with the code you posted above. Here's the entirety of an quick test app:

[DataContract(IsReference = true)]
public abstract class EntityBase
{
    [NotMapped]
    public virtual int? Key
    {
        get { return 1; } //GetKeyExtractor(ConversionHelper.GetEntityType(this))(this); }
    }
    //  other properties and methods!
}

[DataContract(IsReference = true)]
public partial class Person : EntityBase
{
    private int? _personID;
    [DataMember, Key]
    public virtual int? PersonID
    {
        get { return _personID; }
        set { _personID = value; }
    }
}

public class CFContext : DbContext
{
    public DbSet<Person> Employers { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

    }
}

class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        Console.WriteLine(p.Key);
    }
}

Which created this table/database: enter image description here

like image 28
Mark Oreta Avatar answered Nov 12 '22 13:11

Mark Oreta