C# 映射不适用于EF代码中的一个实体

C# 映射不适用于EF代码中的一个实体,c#,entity-framework,ef-code-first,mapping,C#,Entity Framework,Ef Code First,Mapping,我首先使用EF 6.1.1code和.NET framework 4,我有一个抽象基类BaseEntity,我的所有其他实体都继承了它。在我的模型中,我有以下课程: public abstract class BaseEntity { public int Id { get; set; } .... } public class Document:BaseEntity public class OrderHeader:Document public class Reque

我首先使用
EF 6.1.1
code和
.NET framework 4
,我有一个抽象基类
BaseEntity
,我的所有其他实体都继承了它。在我的模型中,我有以下课程:

public abstract class BaseEntity 
{
    public int Id { get; set; }
    ....
}

public class Document:BaseEntity

public class OrderHeader:Document

public class RequestHeader:Document
我想通过定义以下映射文件来更改EF默认约定映射:

public class RequestHeader_Mapping : EntityTypeConfiguration<RequestHeader>
{
    public RequestHeader_Mapping()
    {                   
        this.ToTable("RequestHeader");
        this.Property(t => t.Id).HasColumnName("DocumentId");
        ...
    }
}

public class OrderHeader_Mapping : EntityTypeConfiguration<OrderHeader>
{
    public OrderHeader_Mapping()
    {                   
        this.ToTable("OrderHeader");
        this.Property(t => t.Id).HasColumnName("DocumentId");
        ...
    }
}
公共类RequestHeader\u映射:EntityTypeConfiguration
{
公共RequestHeader_映射()
{                   
此.ToTable(“RequestHeader”);
this.Property(t=>t.Id).HasColumnName(“DocumentId”);
...
}
}
公共类OrderHeader_映射:EntityTypeConfiguration
{
public OrderHeader_映射()
{                   
此.ToTable(“OrderHeader”);
this.Property(t=>t.Id).HasColumnName(“DocumentId”);
...
}
}
[更新]

public partial class Document_Mapping : BaseEntity_Mapping<Document>
{
    public Document_Mapping()
    {                   
        this.ToTable("Document");
        this.Property(t => t.Id).HasColumnName("Id");
        this.HasOptional(t => t.Creater).WithMany().HasForeignKey(d => d.CreatedById);
        this.HasOptional(t => t.Modifier).WithMany().HasForeignKey(d => d.ModifiedById);
        this.HasOptional(t => t.Owner).WithMany().HasForeignKey(d => d.OwnerId);
        this.HasOptional(t => t.DocumentStatu).WithMany().HasForeignKey(d => d.DocumentStatusId);
        this.HasOptional(t => t.DocumentStation).WithMany(t => t.Documents).HasForeignKey(d => d.DocumentStationId);
        this.HasOptional(t => t.DocumentType).WithMany().HasForeignKey(d => d.DocumentTypeId);
        this.HasOptional(t => t.DocumentFolder).WithMany().HasForeignKey(d => d.MainFolderId);
        this.HasOptional(t => t.SecurityLevel).WithMany).HasForeignKey(d => d.SecurityLevelId);

        this.Ignore(t => t.ToDocuments);
    }
}


public partial class BaseEntity_Mapping<TEntity> : EntityTypeConfiguration<TEntity> where TEntity:BaseEntity
{
    public BaseEntity_Mapping()
    {
        this.HasKey(e => e.Id);
         this.Property(t=>t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        this.Ignore(t => t.MustDelete);
        this.Ignore(t=>t.PreviousState);
        this.Ignore(t => t.State);
    }
}
public分部类文档映射:BaseEntity映射
{
公共文档映射()
{                   
本表格(“文件”);
this.Property(t=>t.Id).HasColumnName(“Id”);
this.HasOptional(t=>t.Creater).WithMany().HasForeignKey(d=>d.CreatedById);
this.HasOptional(t=>t.Modifier).WithMany().HasForeignKey(d=>d.ModifiedById);
this.HasOptional(t=>t.Owner).WithMany().HasForeignKey(d=>d.OwnerId);
this.HasOptional(t=>t.DocumentStatus).WithMany().HasForeignKey(d=>d.DocumentStatusId);
this.HasOptional(t=>t.DocumentStation).WithMany(t=>t.Documents).HasForeignKey(d=>d.DocumentStationId);
this.HasOptional(t=>t.DocumentType).WithMany().HasForeignKey(d=>d.DocumentTypeId);
this.HasOptional(t=>t.DocumentFolder).WithMany().HasForeignKey(d=>d.MainFolderId);
this.HasOptional(t=>t.SecurityLevel).WithMany.HasForeignKey(d=>d.SecurityLevel);
忽略(t=>t.ToDocuments);
}
}
公共部分类BaseEntity_映射:EntityTypeConfiguration其中tenty:BaseEntity
{
公共BaseEntity_映射()
{
this.HasKey(e=>e.Id);
this.Property(t=>t.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
this.Ignore(t=>t.MustDelete);
this.Ignore(t=>t.PreviousState);
this.Ignore(t=>t.State);
}
}
并在我的DbContext中以以下方式使用它们:

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
 {
     modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
     modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
     modelBuilder.Configurations.Add(new RequestHeader_Mapping());
     modelBuilder.Configurations.Add(new OrderHeader_Mapping());
     modelBuilder.Configurations.Add(new Document_Mapping());
 }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove();
modelBuilder.Conventions.Remove();
modelBuilder.Configurations.Add(newrequestheader_Mapping());
modelBuilder.Configurations.Add(neworderheader_Mapping());
modelBuilder.Configurations.Add(新文档映射());
}

它适用于
RequestHeader
,但不适用于
OrderHeader
,我的意思是
RequestHeader
表的生成键是
DocumentId
,但是
OrderHeader
Id
,然而,我真的很困惑,有人知道问题出在哪里吗?

我的
OrderHeader
与另一个实体有一对零或一的关系,当我删除它时,问题就解决了

它也适用于OrderHeader,OrderHeader和RequestHeader都有DocumentId列作为PK,检查一下为什么
BaseEntity
中的
Id
属性是虚拟的?@YuliamChandra:我知道,应该如你所说,但对我不起作用!(我总结了
OrderHeader
RequestHeader
类,它们也有其他属性和关系)@DavidG:我更新了问题,
Id
不是
virtual
@Masoud您希望
BaseEntity.Id
始终是主键吗?如果是这样,就值得在上面添加
[Key]
属性。