'Adding entities to collection removes the oldest entity

I have the following two (simplified) classes. A fleet is basically a collection of vehicles.

public class Fleet : IFleet
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public List<IVehicle> Vehicles { get; set; }

    public IVehicle VehicleTemplate { get; set; }

    public Fleet(IVehicle vehicleTemplate, int quantity)
    {
        VehicleTemplate = vehicleTemplate;
        Vehicles = new List<IVehicle>();
        for (int i = 0; i < quantity; i++)
        {
            var vehicle = new Vehicle(vehicleTemplate);
            Vehicles.Add(vehicle);
            vehicle.Fleet = this;
        }
    }
}

public class Vehicle : IVehicle
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ID { get; set; }

    public IFleet Fleet { get; set; }

    public int FleetID { get; set; }
}

I can create Fleets containing multiple vehicles just fine like this:

var fleet = new Fleet(vehicleTemplate, quantity);
fleetRepository.Add(fleet);
vehicleRepository.AddRange(fleet.Vehicles);
context.SaveChanges();

However, whenever I add a vehicle to an existing fleet like in the following example, Entity Framework deletes the oldest vehicle from the database. (It actually executes DELETE FROM [Vehicles] WHERE [ID] = @p18; where @p18 is always the ID of the oldest vehicle in the fleet.)

var fleet = fleetRepository.Get(fleetID);
var newVehicle = new Vehicle(fleet.VehicleTemplate);
newVehicle.Fleet = fleet;
fleet.Vehicles.Add(newVehicle);
vehicleRepository.Add(newVehicle);
fleetRepository.Update(fleet);
context.SaveChanges();

Further testing reveals that only a single record is deleted every time, even when multiple vehicles are added to the fleet at once like in the following code example. It is always the oldest record.

var fleet = fleetRepository.Get(fleetID);
for (int i = 0; i < 2; i++) 
{
    var newVehicle = new Vehicle(fleet.VehicleTemplate);
    newVehicle.Fleet = fleet;
    fleet.Vehicles.Add(newVehicle);
    vehicleRepository.Add(newVehicle);
}
fleetRepository.Update(fleet);
context.SaveChanges();

What is happening here and what can I do so that no vehicle is lost?

Edit: The methods for the repositories that are called look like this:

public class Repository<IEntity, TEntity, TIdentifier> : IRepository<IEntity, TIdentifier> where IEntity : class where TEntity : class, IEntity where TIdentifier : IEquatable<TIdentifier>
{
    protected readonly DbContext context;

    public Repository(DbContext context)
    {
        this.context = context;
    }

    public void Add(IEntity entity)
    {
        context.Set<TEntity>().Add((TEntity)entity);
    }

    public void AddRange(IEnumerable<IEntity> entities)
    {
        context.Set<TEntity>().AddRange(entities.Cast<TEntity>());
    }

    public void Update(IEntity entity)
    {
        context.Set<TEntity>().Update((TEntity)entity);
    }
}

public class VehicleRepository : Repository<IVehicle, Vehicle, Guid>, IVehicleRepository
{
    public VehicleRepository(DbContext context) : base(context)
    {
    }
}

public class FleetRepository :  Repository<IFleet, Fleet, int>, IFleetRepository
{
    public FleetRepository(DbContext context) : base(context)
    {
    }

    public IFleet Get(int id)
    {
        IQueryable<IFleet> query = context.Set<Fleet>();
        query = query.Include(f => f.Vehicles);
        fleet = query.FirstOrDefault(f => f.ID == id);
        return fleet;
    }
}


Solution 1:[1]

There's a lot of redundant EF commands. You can just do;

var fleet = fleetRepository.Get(fleetID);
for (int i = 0; i < 2; i++) 
{
    var newVehicle = new Vehicle(fleet.VehicleTemplate);
    newVehicle.FleetID = fleet.ID;
    vehicleRepository.Add(newVehicle);
}
context.SaveChanges();

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1