如何检测 1-N 上的变化

本文关键字:1-N 变化 检测 何检测 | 更新日期: 2023-09-27 18:33:48

简单的问题。我在使用 NHibernate 时没有遇到这个问题,但现在我在 EntityFramework 中遇到了这个问题:

想象一下,我有一辆车,上面有轮胎清单。

我想拆掉汽车的 1 个轮胎,所以我想更新它。像这样:

Car.Tires.Remove(tire);

然后我用这个更新方法更新汽车对象:

public virtual void Update(T obj)
{
     TryAttach(obj);
     SetAllModified(obj);
     SaveChanges();
}

问题是更新后,汽车仍然具有相同数量的轮胎。

调用更新方法时如何更新轮胎列表?

如何检测 1-N 上的变化

您需要在数据库中找到轮胎,然后将其删除:

var tire=context.Tires.Where(t=>t.Name==tireName).Single();
Car.Tires.Remove(tire);
context.SaveChanges();

首先,你的设置方式有点奇怪......如果没有更多的代码,很难弄清楚你在做什么,但如果我自己使用实体框架来做这件事,这就是我所期望的。

首先。。。你需要一个 DbContext,你的上下文看起来像这样......

public class SomeContext : DbContext
{
    public DbSet<Car> Cars { get; set; }
    public DbSet<Tyre> Tires { get; set; }
}

然后一些波科斯...

public class Car {
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual List<Tyre> Tires { get; set; }
}
public class Tyre {
    public virtual int Id { get; set; }
    // More properties...
    [ForeignKey("CarId")]
    public virtual int CarId { get; set; }
    public virtual Car Car { get; set; }
}

那么我希望你做这样的事情......经过漫长的一天后,我的大脑工作起来并不完全相同,但基本上......从从数据库中加载的 Car 对象中删除不再需要的轮胎,然后保存更改。

using (var context = new SomeContext())
{
    var car = context.Cars.Find(carId);
    var tyre = car.Tires.Single(t => t.Id == tireId);
    car.Tires.Remove(tyre);
    context.SaveChanges();
}

希望这有帮助。