2012-12-04 101 views
2

我收到错误消息; 错误3032:映射从第77行开始的映射片段中的问题:条件成员'Company.CompanyTypeId'的映射是'IsNull = False'以外的条件。删除Company.CompanyTypeId上的条件或从映射中删除它。实体框架TPH继承错误:

我已经完成了如何解决这个问题,但我不明白答案。

我的类

public abstract class Company 
    { 
     public Company() 
     { 
      this.AddressLines = new List<AddressLine>(); 
     } 

     public int CompanyId { get; set; } 
     public int CompanyTypeId { get; set; } 

     public string Comments { get; set; } 

     public DateTime? EndOfBusinessDate { get; set; } 


     public virtual CompanyType CompanyType { get; set; } 
    } 

    public class Subcontractor : Company 
    { 
     public Subcontractor() 
     { 
      this.SubcontractorTrades = new List<SubcontractorTrade>(); 
     } 

     public virtual ICollection<SubcontractorTrade> SubcontractorTrades { get; set; } 
     public string ValueOfWork { get; set; } 
     public string QualityAssured { get; set; } 
     public int? NumberOfOperatives { get; set; } 


     public static IPagedList<Subcontractor> GetSubcontractors(int page, int PageSize) 
     { 
      using (var db = new SherryGreenGroupContext()) 
      { 
       return db.Subcontractors 
        .Include("SubcontractorTrades") 
        .Include("AddressLines") 
        .Where(x => x.EndOfBusinessDate == null) 
        .OrderBy(x => x.Company1) 
        .ToPagedList(page, PageSize); 
      } 
     } 
    } 

我映射的样子;

public CompanyMap() 
    { 
     // Primary Key 
     this.HasKey(t => t.CompanyId); 

     // Properties 
     this.Property(t => t.Comments).HasMaxLength(1023); 

     // Table & Column Mappings 
     this.ToTable("Company"); 
     this.Property(t => t.CompanyId).HasColumnName("CompanyId"); 

     this.Property(t => t.CompanyTypeId).HasColumnName("CompanyTypeId"); 
     this.Property(t => t.Comments).HasColumnName("Comments"); 
     this.Property(t => t.Created).HasColumnName("Created"); 

     // Relationships 
     this.HasRequired(t => t.CompanyType).WithMany(t => t.Companies).HasForeignKey(d => d.CompanyTypeId); 
    } 
} 

public class SubcontractorMap : EntityTypeConfiguration<Subcontractor> 
{ 
    public SubcontractorMap() 
    { 
     this.Property(t => t.QualityAssured).IsFixedLength().HasMaxLength(1); 
     this.Property(t => t.ValueOfWork).HasMaxLength(255); 

     this.Property(t => t.QualityAssured).HasColumnName("QualityAssured"); 
     this.Property(t => t.ValueOfWork).HasColumnName("ValueOfWork"); 
     this.Property(t => t.NumberOfOperatives).HasColumnName("NumberOfOperatives"); 
    } 
} 

上下文类看起来像

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Configurations.Add(new CompanyMap()); 
     modelBuilder.Configurations.Add(new SubcontractorMap()); 
     modelBuilder.Configurations.Add(new SupplierMap()); 
     modelBuilder.Configurations.Add(new ArchitectsAndSurveyorMap()); 
     modelBuilder.Configurations.Add(new StructuralEngineerMap()); 
     modelBuilder.Configurations.Add(new CostConsultantMap()); 
     modelBuilder.Configurations.Add(new ServiceEngineerMap()); 
     modelBuilder.Configurations.Add(new CompanyTypeMap()); 
        modelBuilder.Entity<Company>() 
      .Map<Subcontractor>(m => m.Requires("CompanyTypeId").HasValue(4)) 
      .Map<Supplier>(m => m.Requires("CompanyTypeId").HasValue(5)) 
      .Map<ArchitectsAndSurveyor>(m => m.Requires("CompanyTypeId").HasValue(1)) 
      .Map<StructuralEngineer>(m => m.Requires("CompanyTypeId").HasValue(2)) 
      .Map<CostConsultant>(m => m.Requires("CompanyTypeId").HasValue(3)) 
      .Map<ServiceEngineer>(m => m.Requires("CompanyTypeId").HasValue(6)); 
    } 
} 

我从类定义和映射代码都试图commentinout出CompanyTypeId,但我得到了同样的错误

回答

4

如果你想使用CompanyTypeId作为TPH的鉴别器,您不得将其用于其他任何事情=>您不能将其作为Company类中的属性,并且您不能与CompanyType类关联。原因是继承中的实体类型是不可变的。更改CompanyTypeIdCompanyType,Company类将改变实体的类型,但不能更改现有实例的类型。

+0

CompanyTypeId在公司数据表中。那么,当我在GetSubcontractors()查询中查询数据库时,如何忽略此字段? – arame3333

+0

是的,它在表格中,但您的映射已经使用它来将分包商定义为继承类型。 –

+0

当我从Company类中删除CompanyTypeId时,我收到一个SQL异常;无效的列名称'CompanyType_CompanyTypeId'。 – arame3333