7

我首先将我的 EF POCO 项目转换为代码。我更改了 T4 模板,因此我的所有实体都使用一个基类 ,EntityBase它为它们提供了一些与持久性无关的通用功能。

如果我[NotMapped]在 上使用属性EntityBase,则所有实体都继承此属性,并且The type 'X.X.Person' was not mapped对于我尝试与 EF 一起使用的任何类型,我都会得到一个。

如果我[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 配置。

4

2 回答 2

4

尝试将其定义EntityBaseabstract,如果可能的话,并将NotMapped... 放在您不想映射的属性上应该可以解决问题。

于 2012-08-27T12:12:06.387 回答
4

您是要创建一个所有实体共享的 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);
    }
}

哪个创建了这个表/数据库: 在此处输入图像描述

于 2012-08-27T14:27:32.507 回答