【问题标题】:mapping does not work for one entity in EF code first映射首先不适用于 EF 代码中的一个实体
【发布时间】: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,但对于OrderHeaderId,但我真的很困惑,有谁知道问题出在哪里?

【问题讨论】:

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

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 2011-08-29
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多