2017-11-17 3 views
0

クラスには、VisitModelとVisitorModelが必要です。visitModelにはVisitorModelが多くあり、その逆もあります。両方の関係をmodelBuilderに追加した後も、3番目の自動生成テーブルに保存されません。テーブルを作成しましたが、保存しようとすると両方のIDが保存されません。Entity Frameworkの多対多テーブルが自動的に保存されないのはなぜですか?

public class VisitModel 
{ 
    public VisitModel() 
    { 
     VisitorModels = new List<VisitorModel>(); 
    } 
    public int VisitModelId { get; set; } 
    public DateTime DateCreated { get; set; } 
    public DateTime DateModified { get; set; } 
    public bool IsDeleted { get; set; } 
    public string UserToVisit { get; set; } 
    public virtual User User { get; set; } 
    public string HostEmail { get; set; } 
    public int UserId { get; set; } 
    public int VisitorTypeId { get; set; } 
    public int PurposeOfVisitId { get; set; } 
    public string OtherPurposeOfVisit { get; set; } 
    public DateTime ArrivalDate { get; set; } 
    public DateTime ArrivalTime { get; set; } 
    public DateTime DepartureTime { get; set; } 
    public DateTime DepartureDate { get; set; } 
    public bool IsCheckedIn { get; set; } 
    public bool IsCheckedOut { get; set; } 
    public string BookedBy { get; set; } 
    public bool IamHost { get; set; } 
    public virtual ICollection<VisitorModel> VisitorModels { get; set; } 
} 

そして、これはModelBuilderのです::

public class VisitorModel 
{ 
    public int VisitorModelId { get; set; } 
    public DateTime DateCreated { get; set; } 
    public DateTime DateModified { get; set; } 
    public bool IsDeleted { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string FullName { get; set; } 
    public string Phone { get; set; } 
    public string Email { get; set; } 
    public string PhotoUrl { get; set; } 
    public string Address { get; set; } 
    public int BranchId { get; set; } 
    public int UserId { get; set; } 
    public virtual User User { get; set; } 
    public virtual ICollection<VisitModel> VisitModels { get; set; } 
} 

、ここではVisitModelクラスである:ここに私のコードです

modelBuilder.Entity<VisitModel>() 
    .HasMany(up => up.VisitorModels) 
    .WithMany(course => course.VisitModels) 
    .Map(mc => 
    { 
     mc.ToTable("VisitVisitorModel"); 
     mc.MapLeftKey("VisitModelId"); 
     mc.MapRightKey("VisitorModelId"); 
    }); 

私が保存しようとすると、それは両方の保存されません。 Idを、VisitVisitorModelテーブルに追加します。テーブルは常に空です。私は間違って何をしていますか?

+0

保存するコードを表示します。 –

答えて

0

entity framework many-to-many conventionsに従ったため、接合テーブルの設計に流暢なAPI部品は必要ありません。

エンティティ・フレームワークは、クラス定義を見るだけで、多対多の関係を設計していることがわかります。 Entity Frameworkは、適切な接合テーブルを設計します。あなたもあなたのdbContextで、この交差テーブル言及しないでください。

class MyDbContext : DbContext 
{ 
    public DbSet<VisitModel> VisitModels {get; set;} 
    public DbSet<VistitorModel> VistiroModels {get; set} 
} 

をしかし、私は私のジャンクションテーブルにはDbSetを持っていない場合、私は私がVisitModelとVisitorModelに参加する方法を行うことができますか?

答えは次のとおりです。結合を使用しないでください。ICollectionsを使用してください。

通常は、接合テーブルでVisitorModelに参加するだろう

今日

にチェックインしたこと私の名前とそのVisitModelsのすべての到着時刻と出発時刻をtogeter削除されていないすべてのVisitorModelsの住所を与えますVisitModelIdのVisitVisitorModelを開き、VisitorModelIdのVisitModelに再度参加します。

しかし、あなたはまた、ICollectioinsを使用することができます。主キーと結合ので、あなたが交差テーブルを必要としません適切な多対多の構成で

var result = myDbContext.VisitorModels 
    .Where(visitorModel => !visitorModel.IsDeleted) 
    .Select(visitorModel => new 
    { 
     // select only the properties of visitorModel you will be using: 
     FullName = visitorModel.FullName, 
     Address = visitorModel.Address, 
     Phone = visitorModel.Phone, 
     ... // other properties 

     // get ArrivalTime and DepartureTime of all VisitModels that are checked in 
     VisitModels = visitorModel.VisitModels 
      .Where(visitModel => visitModel.IsCheckedInd) 
      .Select(visitModel => new 
      { // again: select only the properties you will be using: 
       ArrivalTime = visitModel.ArrivalTime, 
       DepartureTime = visitModel.DepartureTime, 
       ... // other properties 
      }) 
      .ToList(), 
    } 
} 

、そしてあなたがする必要はありません外部キー。 Entityフレームワークは、どのジョインを行うかを認識します。

+0

私は、コンテキストテーブルにファーストクラスのエンティティとしてジャンクションテーブルを含めないように助言することに本当に注意します。自動的に仕事をさせることは、私の頭痛を引き起こすことはありません。とにかく私はいつもそれらを加えなければならなくなってしまった。この時点で、私は最初からそれらを含めて、潜在的なトラブルを回避します。 –

+0

うわー!、あなたのソリューションは魅力的に機能しました!!! ...私はジャンクションテーブルを呼び出さなくても必要なリストを得ることができますありがとうございました。しかし、どうしたらリストをビューに結び付けることができますか?もう一度ありがとう! – user8107351

+0

私はBradleyのコメントに同意しません。私は接合テーブルなしで生活することは決してありませんでしたが、DbContextはデータがSQLデータベースかExcelスプレッドシートかCSVファイルなのかどうかを隠すべきだと私は思っています。実際に必要とするより多くのクラスを必要としないことは、一般的に認められています。これにより、再利用性と保守性が向上します –

関連する問題