EF 6 Code First Base Entity Id属性

时间:2014-08-12 13:55:55

标签: c# entity-framework ef-code-first

我们有一个现有的数据库,其中每个实体都有一个像UserId,CustomerId这样的Id。我试图像这样引入一个BaseEntity类:

public abstract class BaseEntity : IEntity
{
  public int Id { get; protected set; }
}

这样我就可以访问任何实体的Id属性,而不必知道它的名称。然而,这导致我们构建DbContext的方式出现问题。我们收到错误抱怨Id属性,因为它在db表中不存在。当我们试图忽略它时,我们会得到其他错误:

You cannot use Ignore method on the property 'Id' on type 'xxx' because this type
inherits from the type 'xxx.BaseEntity' where this property is mapped. To exclude this     
property from your model, use NotMappedAttribute or Ignore method on the base type.

然而,当我们尝试忽略BaseEntity时:

modelBuilder.Ignore<BaseEntity>();

但是我们得到了错误:

Invalid column name 'Id'.

显然,我错过了一些非常明显的东西,但任何帮助都会受到赞赏。基本上我希望EF DbContext完全忽略Id属性,因为我们使用它的方式超出了数据库的上下文。

编辑:

如果我打电话似乎:

this.Ignore(e => e.Id);

对于每个EntityTypeConfiguration然后它可以工作,但我希望有一个更通用的解决方案,我尝试创建一个基本配置,如下所示:

  public abstract class BaseEntityTypeConfiguration<T> : EntityTypeConfiguration<T> where T : class, IEntity
  {
    public BaseEntityTypeConfiguration()
    {
      this.Ignore(e => e.Id);
    }
  }

但我再次收到此错误:

You cannot use Ignore method on the property 'Id' on type 'xxx' because this type
inherits from the type 'xxx.BaseEntity' where this property is mapped. To exclude this     
property from your model, use NotMappedAttribute or Ignore method on the base type.

在基类的Id属性上使用NotMapped确实有效,但我希望用流畅的api做到这一点。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我们在基类

中定义它
[NotMapped]
public abstract TId Id { get; protected set; }

然后在继承的实体

public override int Id { 
    get { return AssessmentID; } protected set { AssessmentID = value; } 
}

[Key]
public int AssessmentID { get; set; }

答案 1 :(得分:0)

您只需要忽略该属性,而不是整个类:

modelBuilder.Entity<BaseEntity>().Ignore(e => e.Id);