如何防止相关记录与EF 5 Code First中的主记录一起保存?

时间:2013-04-12 08:43:47

标签: entity-framework ef-code-first entity-framework-5

我有一个班级:

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对象的集合。在映射期间,我使用查找函数来确定MovementTypeMovementTypeId的正确值,但是当我尝试使用“旧”VehicleMovement保存新的VehicleMovementType时,我在VehicleMovementType实体上获得了重复的密钥异常。

2 个答案:

答案 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);

请记住,不会跟踪从不同上下文加载的对象,当您将它们添加到第一个上下文时,它们会显示为新的且未连接,并且可以插入。