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.
Inheritance with EF Code First: Table per Hierarchy (TPH)
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.
This tutorial demonstrates how to implement TPH inheritance. TPH is the only inheritance pattern that the Entity Framework Core supports.
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.
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:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With