Alireza
Alireza

Reputation: 5533

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.

Upvotes: 7

Views: 7115

Answers (2)

Mark Oreta
Mark Oreta

Reputation: 10416

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

Upvotes: 4

Rapha&#235;l Althaus
Rapha&#235;l Althaus

Reputation: 60503

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.

Upvotes: 4

Related Questions