EF Core - 添加相关实体时出错

时间:2017-09-04 16:14:45

标签: c# entity-framework .net-core entity-framework-core

当我尝试更新已从数据库获取的实体的相关实体时,出现错误。为了便于说明,我有这些想法:

    class Car
{
   int Id ..;
   string Name ..;
   virtual ICollection<TireCar> tires ...;
}

class TireCar
{
  int Id ..;
  int TireId ..;
  int CarId..;
  int Size..;
  virtual TireBrand tire;
  virtual Car car;
}

class TireBrand
{
  int Id;
  string Name ..;
}

所以,我正在尝试制作一个Patch方法,允许我更新Car数据,并添加,更新或删除tires。当我获得Car实体时会发生问题,之后我会添加Tire。这样的事情:

    void UpdateCar()
    {
        var car = carService.Get(...);

        ...

        carService.AddTire(new TireCar{ CarId = car.Id, TireId = 1 });

        ...
    }

我正在使用带有DI的Repository模式,因此上下文是相同的。抛出的错误是:

  

System.InvalidOperationException:实体类型“Car”和“TireCar”之间的关联已被切断,但此关系的外键不能设置为null。如果应删除依赖实体,则设置关系以使用级联删除。'

我尝试了两件有效的方法,但我认为不是解决方案:

  • 我在添加轮胎后获得汽车
  • 当我将汽车视为无追踪时

如果我正在更新另一张桌子,为什么会这样?我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:0)

您的问题实际上是配置问题,而不是EF Core的问题。仔细阅读错误说明的内容:

实体类型之间的关联&#39; Car&#39;和&#39; TireCar&#39;已被切断但此关系的外键无法设置为空。如果应删除依赖实体,则设置关系以使用级联删除。

当依赖实体变为孤立时,实体框架核心默认情况下(.NET Core 2.0转发)具有 SET NULL 策略。如果我们仔细查看您的TireCar模型,则不会将CarId属性设置为可空,因此该列不能设置为null。

你有太多不同的解决方案来解决这个问题。如果您希望在TireCar实体中删除Car实体时将其删除,请为此关系设置级联删除(您也可以更改EF Core默认策略)。这可以通过DbContextFluentApi设置。

class MyContext : DbContext
{
    // Your DbSets

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<TireCar>()
            .HasOne(tc => tc.car)
            .WithMany(car => car.tires)
            .OnDelete(DeleteBehavior.Cascade);
    }
}

另一种解决方案是让TireCar实体在null列中包含CarId个值,只需更改您的实体模型即可。

class TireCar
{
    public int Id  { get; set; }
    public int TireId { get; set; }
    public int? CarId { get; set; }
    public int Size { get; set; }
    public virtual TireBrand tire { get; set; }
    public virtual Car car { get; set; }
}