ЗАКЛЮЧИТЕЛЬНОЕ РЕШЕНИЕ
Благодаря вашей ссылке на InverseProperty я обнаружил удивительную статью, которая описывает именно то, что я хотел достичь, используя свободный API. Эта статья была написана в январе, но я уверен, что CTP5 теперь официально является частью ядра MVC 3 и EF.
Ассоциации в EF Code First CTP5
Хорошо ... Я собираюсь документировать то, что я нашел, чтобы работать отлично! Я ненавижу, когда люди оставляют частичные ответы, поэтому мы идем.
Здесь есть небольшая избыточность, но она работает. Класс моей цитаты выглядит так:
[ForeignKey("Creator")]
public virtual int CreatorID { get; set; }
[InverseProperty("CreatedQuotes")]
public virtual User Creator { get; set; }
[ForeignKey("Agent")]
public virtual int AgentID { get; set; }
[InverseProperty("OwnedQuotes")]
public virtual User Agent { get; set; }
[ForeignKey("Manager")]
public virtual int ManagerID { get; set; }
[InverseProperty("ManagedQuotes")]
public virtual User Manager { get; set; }
Тогда мой класс User выглядит так:
public virtual ICollection<Quote> CreatedQuotes { get; set; }
public virtual ICollection<Quote> OwnedQuotes { get; set; }
public virtual ICollection<Quote> ManagedQuotes { get; set; }
Наконец, мой класс DBContext выглядит следующим образом:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
modelBuilder.Entity<Quote>()
.HasRequired(a => a.Manager)
.WithMany()
.HasForeignKey(u => u.ManagerID);
modelBuilder.Entity<Quote>()
.HasRequired(a => a.Agent)
.WithMany()
.HasForeignKey(u => u.AgentID).WillCascadeOnDelete(false);
modelBuilder.Entity<Quote>()
.HasRequired(a => a.Manager)
.WithMany()
.HasForeignKey(u => u.ManagerID).WillCascadeOnDelete(false);
}
Вы можете видеть избыточность в аннотации ForeignKey в классе Quote и в отображении Fluent API в классе DbContext, но это ничего не меняет. Я, вероятно, мог бы покончить с аннотациями в классе Quote, но Fluent API необходим, чтобы установить для каскадного правила значение false, чтобы предотвратить конфликты внешних ключей.
Я смог перемещаться в обоих направлениях без проблем и точно так, как ожидалось.
Спасибо за вашу помощь!