这就是我们所拥有的:
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表CAR包含两列int Id和int EngineID(FK到Engine表)
因此,假设我们在Car DB表中存在一个car对象。但我们想要更新记录并为汽车添加引擎,因此我们在下面进行分配。
var car = new car()
{
id=1,
new Engine()
{
id=5,
EngineName="V8"
}
}
现在我们使用
carDataProvider.AddOrUpdate(car);
_unitOfWork.Commit();
但是使用我的映射的实体框架不会更新CAR表中的引擎 Id 字段,但是如果我使用Add(car);然后将创建汽车记录(例如,id = 2; EngineId = 99;)以及引擎记录(如果不存在)。
我应该更改映射还是我可以调用AddOrUpdate(car)的其他方式;以便引擎 Id 字段会更新?
答案 0 :(得分:3)
我建议您以这种方式配置模型:
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 is 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;
}
}