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]
属性。