Two times same code in methode except one little line
I think in this case I would simply make a private method to capture the duplicated code.  I probably wouldn't mind about the extra call to the SaveChanges() as it's only one line and removes any need for further complexity on the code.

public void Insert(Device device, IEnumerable&lt;int&gt; selectedFrameworks, IEnumerable&lt;int&gt; selectedOSs)
{
    UpdateDeviceProperties(device, selectedFrameworks, selectedOSs);

    _deviceRepo.Insert(device);
    _deviceRepo.SaveChanges();
}

public void Update(Device device, IEnumerable&lt;int&gt; selectedFrameworks, IEnumerable&lt;int&gt; selectedOSs)
{
    UpdateDeviceProperties(device, selectedFrameworks, selectedOSs);

    _deviceRepo.Update(device);
    _deviceRepo.SaveChanges();
}

private void UpdateDeviceProperties(Device device, IEnumerable&lt;int&gt; selectedFrameworks, IEnumerable&lt;int&gt; selectedOSs) 
{
    device.Framework = GiveObjects&lt;Framework&gt;(selectedFrameworks, _frameworkRepo); 
    device.OS = GiveObjects&lt;OS&gt;(selectedOSs, _osRepo);

    SetStateUnchanged&lt;Framework&gt;(device.Framework);
    SetStateUnchanged&lt;OS&gt;(device.OS);
}


I might also consider returning either a boolean (or some other error result) from the methods to raise awareness of whether the db action actually succeeded to help with raising failures back to the caller of the method.

In the case of Insert it could be as simple as (assuming device has an Id of course) return device.Id &gt; 0;