数据库设计,one2many,表之间的双向依赖

时间:2017-04-02 16:20:05

标签: asp.net-mvc code-first

我正在研究贷款系统。 我有2张桌子。贷款和工具。一笔贷款可以有更多的工具。

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. 工具可用性 - 借入/未借用。
  2. 我通过在Tool表中使用LoanId解决了这个问题,检查它是否为null。

    1. 交易历史

      这里我有一个问题。 icollections似乎只包含Tool表的外键。因此,当我将LoanId设置为null(表示该工具已返回并且可以再次借用)时,我将丢失历史记录。 我该怎么解决这个问题。我应该在贷款表中定义另一个外键吗?像这样:

      // foreign key to Tool
      public IList<int> ToolId { get; set; }
      public virtual Tool Tool { get; set; }
      
    2. 对我来说外键似乎是循环依赖。实现所需功能的正确方法是什么?

      感谢您的任何建议。

1 个答案:

答案 0 :(得分: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();

还值得一提的是,您需要在新贷款或退款时更新工具IsAvailable属性。