c# - Entity Framework 代码先将 FK 加倍为 PK
问题描述
我需要先使用 Fluent API 使用 Fntity Framework 代码映射一些实体。
我有一个Driver
和一个RacingVehicle
。我需要一个Driver
只有一个RacingVehicle
,一个RacingVehicle
只有一个Driver
。
Booth 类是指Contract
连接它们的类(Association Class?)。A显示了一些额外的信息:他和他之间的合同将持续Contract
多少年。Driver
RacingVehicle
我当前的代码:
public class Driver
{
public Guid Id { get; protected set; }
public string Name { get; protected set; }
// others properties
public virtual Contract Contract { get; protected set; }
}
public class RacingVehicle
{
public Guid Id { get; protected set; }
public int Number { get; protected set; }
public virtual Team Team { get; protected set; }
// others properties
public virtual Contract Contract { get; protected set; }
}
public class Contract
{
public virtual Driver Driver { get; protected set; }
public virtual RacingVehicle RacingVehicle { get; protected set; }
public int SeasonsRemaining { get; protected set; }
}
我将访问RacingVehicle
from Driver
,仅通过Contract
(反之亦然)。像这样的东西:
var teamName = ayrtonSenna.Contract.RacingVehicle.Team.Name;
var driverName = mcLaren.Contract.Driver.Name;
我将有一个ContractManager
服务类来管理这些合同。
我相信Contract
该类必须映射为 PK,FK 来自Driver
and RacingVehicle
,对吗?
那么,我该如何映射呢?
解决方案
您通常会OnModelCreating()
在上下文类的方法中像这样配置复杂的主键,如下所示:
public class Contract
{
public int DriverId { get; set; }
public virtual Driver Driver { get; set; }
public int RacingVehicleId { get; set; }
public virtual RacingVehicle RacingVehicle { get; set; }
public int SeasonsRemaining { get; set; }
}
public class RacingContext : DbContext
{
public DbSet<Driver> Drivers { get; set; }
public DbSet<RacingVehicle> RacingVehicles { get; set; }
public DbSet<Contract> Contracts { get; set; }
public override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Contract>().HasKey(contract => new { contract.DriverId, contract.RacingVehicleId });
}
}
但是,这意味着您不能添加重复的条目。因此,如果车手“Bob”与 McLaren 签订了一份合同,那么当合同结束时,他又与 McLaren 签订了另一份合同,您必须删除或覆盖旧合同,以便存储新合同的详细信息. 如果你不关心历史,只对当前合约感兴趣,那么这个设置就可以了。如果你想要完整的历史记录,你必须给每个合约一个唯一的 id,或者添加代码来检查你的合约没有重叠。您不能仅通过主键轻松执行此操作。
推荐阅读
- javascript - localStorage.removeItem 无法正常工作。我该如何解决?
- amazon-web-services - 我通过 jenkins 部署的 kubernetes 挂起并出现错误:ImagePullBackOff
- azure-active-directory - Azure Functions App with APIM 使用托管标识 - 身份验证和授权
- typescript - TS6133 Typescript 编译器不检查嵌套对象成员的使用
- tensorflow - 所有图像的相同预测类别
- python-3.x - 我可以调用一个函数来设置我的 USERNAME_FIELD = ''吗?
- firebase - Firebase 电话身份验证的操作仅限于 5 个 OTP SMS - Flutter 中的移动应用
- javascript - 如何从 d.ts 调用函数。文件
- node.js - 由于缺少引号,布尔值未在 MERN 堆栈中更新
- r - 如果行不正确,如何删除数据框中的行