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

Database design, one2many, bidirectional dependency between tables

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

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. 工具可用性 - borrowed/not 借用。

我通过使用工具 table 中的 LoanId 解决了这个问题,检查它是否为空。

  1. 交易历史

    这里我有一个问题。 icollections 似乎只包含工具 table 的外键。因此,当我将 LoanId 设置回 null(以指示该工具已归还并且可以再次借用)时,我丢失了历史记录。 我应该如何解决这个问题。我是否也应该在 Loan table 中定义另一个外键?像这样:

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

对我来说,这似乎是外键的循环依赖。实现所需功能的正确方法是什么?

感谢您的任何建议。

贷款模式:

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; }
}

贷款历史模型:

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 属性 进行新贷款或归还贷款时。