当我尝试更新已从数据库获取的实体的相关实体时,出现错误。为了便于说明,我有这些想法:
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。如果应删除依赖实体,则设置关系以使用级联删除。'
我尝试了两件有效的方法,但我认为不是解决方案:
如果我正在更新另一张桌子,为什么会这样?我该怎么做才能解决这个问题?
答案 0 :(得分:0)
您的问题实际上是配置问题,而不是EF Core的问题。仔细阅读错误说明的内容:
实体类型之间的关联&#39; Car&#39;和&#39; TireCar&#39;已被切断但此关系的外键无法设置为空。如果应删除依赖实体,则设置关系以使用级联删除。
当依赖实体变为孤立时,实体框架核心默认情况下(.NET Core 2.0转发)具有 SET NULL 策略。如果我们仔细查看您的TireCar
模型,则不会将CarId
属性设置为可空,因此该列不能设置为null。
你有太多不同的解决方案来解决这个问题。如果您希望在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; }
}