我有一个班级:
public class VehicleMovement: IEntityWithId
{
public int Id { get; set; }
public string EmpNo { get; set; }
public DateTime MovementDate { get; set; }
public DateTime TempMovementTime { get; set; }
public TimeSpan MovementTime { get; set; }
public VehicleMovementType MovementType { get; set; }
public int MovementTypeId { get; set; }
}
然后我有一些CsvHelper代码将CSV文件映射到这些VehicleMovement
对象的集合。在映射期间,我使用查找函数来确定MovementType
和MovementTypeId
的正确值,但是当我尝试使用“旧”VehicleMovement
保存新的VehicleMovementType
时,我在VehicleMovementType
实体上获得了重复的密钥异常。
答案 0 :(得分:0)
只是提示:您不必同时设置MovementTypeId
和导航属性(MovementType
),只需将id放入(如果实体结构已正确连接)。
除了你的任何其他信息,
类似的情况可以用例如
context.Entry(vehicleMovement.MovementType).State = System.Data.EntityState.Unchanged;
如果这就是你想要的我猜。
答案 1 :(得分:0)
我使用VehicleMovementTypeDictionary
根据传入的CSV文件中的说明查找我的VehicleMovementTyoe
个对象。我犯了错误,在字典的throctor中实例化一个新的DbContext,同时使用原始的DbContext处理翻译的CSV记录。
我更改了字典的代码,使用与我的主要导入例程相同的上下文,即
public MovementTypeDictionary(ParkPayDbContext dbContext)
{
foreach (var movementType in dbContext.VehicleMovementTypes)
{
Add(movementType.Description, movementType);
}
}
以后在主代码中,我传入了共享的DbContect并解决了所有问题:
VehicleMovementReadMap.MovementTypes = new MovementTypeDictionary(_dbContext);
请记住,不会跟踪从不同上下文加载的对象,当您将它们添加到第一个上下文时,它们会显示为新的且未连接,并且可以插入。