我遇到的情况是,拥有几个通用外键会很有意义。也就是说,包含另一个表的 ID 且未定义外键约束的列。
在下面的代码中,
Transfer.FromId
和Transfer.ToId
包含另一个表的ID。确切的表格由 Transfer.FromType
和 Transfer.ToType
列确定。
public enum TransferType
{
Ship, // FK to Ships table
Railcar, // FK to Railcars table
Truck, // FK to Trucks table
}
public class Transfer
{
public TransferType FromType { get; set; }
public int FromId { get; set; }
public TransferType ToType { get; set; }
public int ToId { get; set; }
public DateTime TimeStamp { get; set; }
public double Quantity { get; set; }
}
例如,要查找装载到特定卡车上的所有轨道车,我可能会编写与此类似的 SQL。
select t.*
from Transfers t
join Railcars r on t.ToType = 2 and t.ToId = truckId and t.FromType = 1 and r.Id = truckId
但是我如何在实体框架中编写类似的东西呢?看来我需要单独的查询来首先获取 Railcar ID,然后获取实际的 Railcar。有什么我不知道的技术吗?
这是简单的预加载查询:
var query =
from t in ctx.Transfers
where t.ToId == truckId && t.ToType = TransferType.Truck && t.FromType = TransferType.Railcar
select new
{
Transfer = t
Railcars = ctx.Railcars.Where(r => r.Id = truckId).ToList()
};