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

标签 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 });

        ...
    }

我将 Repository 模式与 DI 结合使用,因此上下文是相同的。抛出的错误是:

System.InvalidOperationException: The association between entity types 'Car' and 'TireCar' has been severed but the foreign key for this relationship cannot be set to null. If the dependent entity should be deleted, then setup the relationship to use cascade deletes.'

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

  • 当我在添加轮胎后拿到汽车时
  • 当我拿到车时因为没有跟踪

如果我正在更新另一个表,为什么会发生这种情况?我能做些什么来解决这个问题?

最佳答案

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

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

当依赖实体变为孤立实体时,Entity Framework Core 默认(.NET Core 2.0 向前)有一个SET NULL 策略。如果我们仔细看看你的TireCar型号,您没有设置 CarId属性为可空,因此该列不能设置为空。

您有两种不同的解决方案来解决此问题。如果你想要 TireCar当您从 Car 中删除实体时,实体将被删除实体,然后为此关系设置级联删除(您还可以更改 EF Core 默认策略)。这可以在您的 DbContext 中设置通过FluentApi .

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; }
}

关于c# - EF Core - 添加相关实体时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46040886/

相关文章:

c# - 将字符串转换为 C# Unicode 字 rune 字序列

c# - 验证 Live.com(Microsoft 帐户)JWT token

c# - C# 是否支持多重继承 4.0?

c# - 试图了解 TransactionScope

entity-framework - 如何解决使用 TPH 和复杂类型的初始非常慢的 EF 实体调用?

asp.net-core - .Net Core 中间件多次点击页面请求

c# - WinForms 自动保存到数据库(对比保存按钮)

c# - 将域模型子计数投影到 View 模型上,无需额外查询

c# - 尝试使用 .Net Core 3.0 (MongoDB.Driver 2.8.0) 获取对 MongoDB 集合的引用时出现异常

c# - 尽管通过代码运行测试,ReSharper dotcover 仍显示 0% 的覆盖率