对象中的 EF6 AddOrUpdate 对象

EF6 AddOrUpdate object within an object

这就是我们拥有的:

public class Car
    {
      public int Id { get; set; }
      public Engine Engine { get; set; } 
    }

public class Engine
    {
      public int Id { get; set; }
      public string EngineName{ get; set; } 
    }

//Map to the DB tables
public CarMap()
    {
        ToTable("CAR");
        HasKey(t => t.Id);
        Property(t => t.Id).HasColumnName("CAR_ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
        HasOptional(x => x.Engine).WithMany().Map(x => x.MapKey("ENGINE"));
    }    

DB table CAR由两列int Id和int EngineID组成(FK to the Engine table)

假设我们在汽车数据库中有一个汽车对象 table。但是我们想更新记录并为汽车添加引擎,所以我们在下面分配它。

 var car = new car()
    { 
      id=1, 
      new Engine()
                 {
                  id=5,
                  EngineName="V8"
                 }
    }

现在我们使用

carDataProvider.AddOrUpdate(car);
_unitOfWork.Commit();

但是使用我的映射的 entity framework 不会更新 CAR table 中的 EngineId 字段,但是如果我使用 Add(car );然后将创建汽车记录(f.e。id=2;EngineId=99;)以及引擎记录(如果不存在)。

所以我应该更改映射或者我还能如何调用 AddOrUpdate(car);以便更新 EngineId 字段?

我建议您这样配置模型:

public class Car
{
  public int Id { get; set; }
  public int EngineId { get; set; }
  public Engine Engine { get; set; } 
}

public class Engine
{
  public int Id { get; set; }
  public string EngineName{ get; set; } 
}

关系配置是这样的:

public CarMap()
{
    ToTable("CARS");
    HasKey(t => t.Id);
    Property(t => t.Id).HasColumnName("CAR_ID");
    HasOptional(x => x.Engine).WithMany().HasForeignKey(x=>x.EngineId);
}

如您所见,我删除了您指定 Car Id 为 Identity 的代码,您不需要这样做,这是 int 类型 PK 的默认行为。所以,如果你想自己设置引擎 ID,你需要配置你的实体,如下所示:

public EngineMap()
{
    ToTable("ENGINES");
    HasKey(t => t.Id);
    Property(t => t.Id).HasColumnName("ENGINE_ID").HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);   
} 

我不知道你的 AddOrUpdate 方法的实现是什么,但我想它应该是这样的:

public void AddOrUpdate(Car car)
{
    if (car.Id == default(int)) {
        // New entity
        context.Cars.Add(car);
    } else {
        // Existing entity
        context.Entry(car).State = EntityState.Modified;
    }
}