首先在EF代码中继承公共基类

时间:2012-08-27 12:05:22

标签: entity-framework ef-code-first ef4-code-only

我首先将我的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配置。

2 个答案:

答案 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);
    }
}

哪个创建了这个表/数据库:   enter image description here