Entity Framework 6 - Fluent API - для создания левого соединения - PullRequest
0 голосов
/ 20 января 2019

У меня есть следующие 3 объекта, которые сопоставлены с таблицами базы данных с помощью Fluent API.Вот объявление 3 класса.

public class SoftwareCostHistory
{
    public SoftwareCostHistory()
    {
    }

    [Key]
    public decimal SoftwareCostHistoryId{ get; set; }
    public decimal SoftwareId{ get; set; }
    public decimal PhaseId{ get; set; }
    public decimal Cost { get; set; }
    .....

    public virtual SoftwarePhase SoftwarePhase { get; set; }              
}

public class SoftwarePhase
{
    public SoftwarePhase()
    {
    }

    [Key]
    public decimal SoftwarePhaseId{ get; set; }
    public decimal SoftwareId{ get; set; }
    public decimal PhaseId{ get; set; }
    public decimal Cost { get; set; }
    ......

    public virtual ICollection<SoftwareCostHistory> SoftwareCostHistories{ get; set; }
    public virtual ICollection<SoftwarePhaseHistory> SoftwarePhaseHistories { get; set; }
}

public class SoftwarePhaseHistory
{
    public SoftwarePhaseHistory()
    {
    }

    [Key]
    public decimal SoftwarePhaseHistoryId{ get; set; }
    public decimal SoftwarePhaseId{ get; set; }
    public decimal Cost { get; set; }
    ..........

    public virtual SoftwarePhase SoftwarePhase { get; set; }        
}

И SoftwareId, и PhaseId НЕ являются полями Nullable как в SoftwareCostHistory, так и в SoftwarePhase.Я хотел бы создать ассоциации (свойства навигации) между (1) SoftwareCostHistory и SoftwarePhase;(2) SoftwarePhase и SoftwarePhaseHistory.Вот как я пишу Fluent API.

public class SoftwarePhaseConfiguration : EntityTypeConfiguration<SoftwarePhase>
{
    public SoftwarePhaseConfiguration()
    {
        //this.HasKey(sp => new { sp.SoftwareId, sp.PhaseId}); //I can't do this because it conflicts with PK already defined in class structure.
        this.Property(sp=> sp.SoftwarePhaseId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        this.HasMany(sp => sp.SoftwarePhaseHistories).WithRequired(sph=> sph.SoftwarePhase).HasForeignKey(sph => sph.SoftwarePhaseId);
       // this.HasMany(sp => sp.SoftwareCostHistories).WithRequired(sch=> sch.SoftwarePhase).HasForeignKey(sch => new { sch.SoftwareId, sch.PhaseId});
        this.ToTable("SOFTWAREPHASE");
        .....
        .....
    }
}

 public class SoftwarePhaseHistoryConfiguration : EntityTypeConfiguration<SoftwarePhaseHistory>
{
    public SoftwarePhaseHistoryConfiguration ()
    {
        this.Property(sph => sph.SoftwarePhaseHistoryId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        this.ToTable("SOFTWAREPHASEHISTORY");
        .....
        .....
    }
}

 public class SoftwareCostHistoryConfiguration : EntityTypeConfiguration<SoftwareCostHistory>
{
    public SoftwareCostHistoryConfiguration ()
    {
        this.Property(sch=> sch.SoftwareCostHistoryId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);            
        this.ToTable("SOFTWARECOSTHISTORY");
        .....
        .....
    }
}

Как вы заметили выше, я могу создавать навигационные свойства между SoftwarePhase и SoftwarePhaseHistory на основе внешнего ключа SoftwarePhaseId.Теперь я хотел бы создать ассоциации между SoftwarePhase и SoftwareCostHistory.Поскольку свойства объявляются в обоих классах, я могу создавать ассоциации (Свойства навигации) только с помощью SoftwareId и PhaseId.Оба поля не обнуляются.Я пытался это сделать.Вы можете увидеть это в SoftwarePhaseConfiguration ().Я закомментировал код.Потому что, если я сделаю это, связь между SoftwarePhase и SoftwarePhaseHistory не будет работать.

Как создать ассоциации, используя эти SoftwareId и PhaseId между SoftwareCostHistory и SoftwarePhase.Я не хочу менять структуру таблицы.

PLESE ПРИМЕЧАНИЕ. SoftwarePhase может иметь или не иметь SoftwareCostHistory.Кроме того, SoftwareCostHistory может иметь или не иметь SoftwarePhase.

Спасибо,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...