数据库设计,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; }
}
我想问这样的问题:
- 工具可用性 - borrowed/not 借用。
我通过使用工具 table 中的 LoanId 解决了这个问题,检查它是否为空。
交易历史
这里我有一个问题。 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
属性 进行新贷款或归还贷款时。
我正在研究借贷系统。 我有 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; }
}
我想问这样的问题:
- 工具可用性 - borrowed/not 借用。
我通过使用工具 table 中的 LoanId 解决了这个问题,检查它是否为空。
交易历史
这里我有一个问题。 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
属性 进行新贷款或归还贷款时。