2017-04-02 2 views
0

私は貸出システムに取り組んでいます。 私は2つのテーブルを持っています。ローンとツール。 1つのローンには、より多くのツールがあります。データベース設計、one2Many、テーブル間の双方向依存性

public class Loan 
{ 
    [Key] 
    public int LoanId { get; set; } 

    [Required] 
    public DateTime WhenBorrowed { get; set; } 

    public DateTime? WhenReturned { get; set; } 

    // foreign key to Tool 
    public virtual ICollection<Tool> Tools { get; set; } 
} 

public class Tool 
{ 
    // Primary key 
    public int ToolId { get; set; } 

    [Required] 
    public string Name { get; set; } 

    // foreign key to Loan 
    public int? LoanId { get; set; } 
    public virtual Loan Loan { get; set; } 
} 

は、私のような質問お願いしたいと思います:

  1. ツールの可用性を - 借りない/借りました。

ツールテーブルのLoanIdを使用してnullをチェックして解決しました。

ここ
  • 取引

    の歴史や

      私は問題を抱えています。そのicollectionsは、ツールテーブルへの外部キーだけを含むようです。だから、LoanIdをnullに戻すと(ツールが返され、再び借りることができることを示すために)、私は履歴を失います。 これをどのように解決すればよいですか?ローンテーブルにも別の外部キーを定義する必要がありますか?このように:

      // foreign key to Tool 
      public IList<int> ToolId { get; set; } 
      public virtual Tool Tool { get; set; } 
      

    それは私には外部キーでの循環依存のように思えます。必要な機能を達成するための正しい方法は何ですか?

    ありがとうございます。

  • 答えて

    1

    ローンモデル:

    public class Loan 
    { 
        [Key] 
        public int LoanId { get; set; } 
    
        [Required] 
        public DateTime WhenBorrowed { get; set; } 
    
        public DateTime? WhenReturned { get; set; } 
    
        // foreign key to Tool 
        public virtual ICollection<LoanHistory> History { get; set; } 
    } 
    

    LoanHistoryモデル:

    public class LoanHistory 
    { 
        // foreign key to Tool 
        public int ToolId { get; set; } 
        public virtual Tool { get; set; } 
    
        // foreign key to Loan 
        public int LoanId { get; set; } 
        public virtual Loan Loan { get; set; } 
    } 
    

    ツールモデル:

    public class Tool 
    { 
        // Primary key 
        public int ToolId { get; set; } 
    
        [Required] 
        public string Name { get; set; } 
    
        public bool IsAvailable { get; set; } 
    } 
    

    あなたがローンの履歴を保持この方法です。

    単にそのようなツールを確認するには:

    var AvailableTools = db.Tools 
        .Where(p => p.IsAvailable == true) 
        .ToList(); 
    

    はまた、新しい融資を行うか、1を返すときのツールにIsAvailableプロパティを更新する必要があることを言及する価値があります。

    +0

    ありがとうございました。たぶん3番目のテーブルを使用するのが最善です...これのために。 – user3463614

    +0

    基本的には、多くのものか​​ら多くのものと多くのものとの関係でなければなりません... – user3463614

    関連する問題