我首先将我的EF POCO项目转换为代码。我更改了T4模板,以便我的所有实体都使用基类EntityBase
,它为它们提供了一些与持久性无关的常用功能。
如果我在[NotMapped]
上使用EntityBase
属性,则所有实体都会继承此属性,并为我尝试与EF一起使用的任何类型获得The type 'X.X.Person' was not mapped
。
如果我对[NotMapped]
的所有属性使用EntityBase
,我会收到EntityType 'EntityBase' has no key defined. Define the key for this EntityType
例外
仅供参考:我使用的是Ef 4.3.1
编辑:部分代码:
[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!
}
然后
[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"); }
}
}
对于这两个类,没有流畅的api配置。
答案 0 :(得分:4)
尝试将EntityBase
定义为abstract
,如果可能的话,将NotMapped
...放在您不想映射的属性上就可以了。< / p>
答案 1 :(得分:3)
您是否正在尝试创建所有实体共享的EntityBase表(关于此的精彩博文:Table Per Type Inheritence),或者只是创建一个基础对象,以便所有实体都可以使用相同的方法?我上面发布的代码没有任何问题。这是一个快速测试应用程序的全部内容:
[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);
}
}
哪个创建了这个表/数据库: