7

エンティティフレームワークのコードファーストアプローチを使用していて、2つの1対多の関係でリンクされている2つのオブジェクトがあるとします(1つPersonは多くCarのを所有できますが、各車には所有者と「メインドライバー」があります) 。2つのエンティティは次のとおりです。

public class Person {
    #region Persisted fields
    [Required]
    public int PersonId { get; set; }
    [Required]
    public string FirstName { get; set; }
    [Required]
    public string Surname { get; set; }
    #endregion

    #region Navigation properties
    public virtual ICollection<Car> CarsOwned { get; set; }
    #endregion
}

public class Car {
    #region Persisted fields
    [Required]
    public int CarId { get; set; }
    [Required]
    public string Make { get; set; }
    [Required]
    public string Manufacturer { get; set; }
    [Required]
    public string RegNo { get; set; }
    [Required]
    [ForeignKey("Owner")]
    public int OwnerId { get; set; }
    [Required]
    [ForeignKey("MainDriver")]
    public int MainDriverId { get; set; }
    #endregion

    #region Navigation properties
    public virtual Person Owner { get; set; }
    public virtual Person MainDriver { get; set; }
    #endregion
}

コレクションを決定するために2つの外部キー(OwnerIdまたはMainDriverId)のどちらを使用する必要があるかをエンティティフレームワークにどのように伝えることができますか?これら2つのエンティティを使用してデータベースを自動作成しようとしましたが、明らかに外部キーを使用したいのに、何らかの理由で外部キーとしてCarsOwned使用したいと想定していました。MainDriverIdCarsOwnedOwnerId

4

1 に答える 1

11

これを設定するには、流暢な構成を使用する必要があると思います。

public class YourContext : DbContext
{
   ...
   protected override OnModelCreating(DbModelBuilder modelBuilder)
   {
      modelBuilder.Entity<Car>()
         .HasRequired(c => c.Owner)
         .WithMany(p => p.CarsOwned)
         .HasForeignKey(c => c.OwnerId)
         .WillCascadeOnDelete(false);
          // Otherwise you might get a "cascade causes cycles" error

      modelBuilder.Entity<Car>()
         .HasRequired(c => c.MainDriver)
         .WithMany() // No reverse navigation property
         .HasForeignKey(c => c.MainDriverId)
         .WillCascadeOnDelete(false);
   }
}
于 2012-11-09T16:49:16.183 に答える