1

我正在尝试创建一个结合了 Employee 和 Tractor 表的连接表,以记录员工每次被分配/取消分配卡车的时间。我能够记录初始的employeeID 和 truckId,但是一旦我尝试在不同的时间和日期记录第二个employeeID 和 truckID,代码就会崩溃。因此,Datetime 对象始终是唯一的。

这是它显示的错误:

SqlException:违反主键约束“PK_DriverTractorsAssignmentHistory”。无法在对象“dbo.DriverTractorsAssignmentHistory”中插入重复键。重复键值为 (1, 2)。该语句已终止。

每次为员工分配卡车时,我能想到的一种解决方案是使用多对多关系。如果你有一个更好的解决方案,请告诉我

 public class Employee
 { 
    public int EmployeeID { get; set; }
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }

    public int? TractorID { get; set; }
    public virtual Tractor Tractor { get; set; }
    public virtual List<DriverTractorAssignmentHistory>DriverTractorAssignmentHistories { get; set; }
 }

public class Tractor
{
    public int TractorID { get; set; }
    public string TruckNumber {get; set;}
    public string Status { get; set; } 
    public virtual Employee Employee { get; set; }
    public virtual List<DriverTractorAssignmentHistory> DriverTractorAssignmentHistories { get; set; }

    public Tractor()
    {
        Status = "Available";
    }
}


public class TrailerOrderDbContext:DbContext
{
    public DbSet<Employee> Employees { get; set; } 
    public DbSet<DriverTractorAssignmentHistory> DriverTractorsAssignmentHistory { get; set; }
    public DbSet<Tractor> Tractors { get; set; }

    public TrailerOrderDbContext(DbContextOptions<TrailerOrderDbContext> options)
        : base(options)
    {
    }  

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<DriverTractorAssignmentHistory>().HasKey(co => new { co.EmployeeId, co.TractorId });

        modelBuilder.Entity<DriverTractorAssignmentHistory>()
        .HasOne(e => e.Driver)
        .WithMany(c => c.DriverTractorAssignmentHistories)
        .HasForeignKey(trac => trac.TractorId);

        modelBuilder.Entity<DriverTractorAssignmentHistory>()
        .HasOne(trac => trac.Tractor)
        .WithMany(c => c.DriverTractorAssignmentHistories)
        .HasForeignKey(e => e.EmployeeId);
 }

 }
4

1 回答 1

3

删除这行代码,因为OnModelCreating(ModelBuilder modelBuilder)这行代码可以防止重复数据输入并防止many-to-many映射:

    modelBuilder.Entity<DriverTractorAssignmentHistory>()
        .HasKey(co => new { co.EmployeeId, co.TractorId });

或根据unique key需要进行如下修改:

    modelBuilder.Entity<DriverTractorAssignmentHistory>()
      .HasKey(co => new { co.EmployeeId, co.TractorId, co.AssignTimestamp };
于 2019-02-11T11:29:51.923 回答