У меня есть следующие 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.
Спасибо,