【发布时间】:2014-07-15 09:05:43
【问题描述】:
我首先使用EF 6.1.1 代码和.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");
...
}
}
[更新]
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);
}
}
并在我的 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());
}
它适用于RequestHeader,但不适用于OrderHeader,我的意思是RequestHeader 表的生成密钥是DocumentId,但对于OrderHeader 是Id,但我真的很困惑,有谁知道问题出在哪里?
【问题讨论】:
-
它也适用于 OrderHeader,OrderHeader 和 RequestHeader 都有 DocumentId 列作为 PK,检查这个image
-
BaseEntity中的Id属性为什么是虚拟的? -
@YuliamChandra:我知道,应该如你所说,但对我不起作用!(我总结了
OrderHeader和RequestHeader类,它们也有其他属性和关系) -
@DavidG:我更新了问题,
Id不是virtual。 -
@Masoud 你希望
BaseEntity.Id始终是主键吗?如果是这样,值得将[Key]属性放在上面。
标签: c# entity-framework ef-code-first mapping