首页 > 解决方案 > Entity Framework 代码先将 FK 加倍为 PK

问题描述

我需要先使用 Fluent API 使用 Fntity Framework 代码映射一些实体。

我有一个Driver和一个RacingVehicle。我需要一个Driver只有一个RacingVehicle,一个RacingVehicle只有一个Driver

Booth 类是指Contract连接它们的类(Association Class?)。A显示了一些额外的信息:他和他之间的合同将持续Contract多少年。DriverRacingVehicle

我当前的代码:

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

我将访问RacingVehiclefrom Driver,仅通过Contract(反之亦然)。像这样的东西:

var teamName = ayrtonSenna.Contract.RacingVehicle.Team.Name;
var driverName = mcLaren.Contract.Driver.Name;

我将有一个ContractManager服务类来管理这些合同。

我相信Contract该类必须映射为 PK,FK 来自Driverand RacingVehicle,对吗?

那么,我该如何映射呢?

标签: c#entity-frameworkormef-code-firstef-fluent-api

解决方案


您通常会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,或者添加代码来检查你的合约没有重叠。您不能仅通过主键轻松执行此操作。


推荐阅读