Una forma genérica de guardar una entidad en Entity Framework

Estoy tratando de escribir un GenericEFRepository que será utilizado por otros Repositorios. Tengo un método de guardar como abajo.

public virtual void Save(T entity) // where T : class, IEntity, new() And IEntity enforces long Id { get; set; }
{
    var entry = _dbContext.Entry(entity);

    if (entry.State != EntityState.Detached)
        return; // context already knows about entity, don't do anything

    if (entity.Id < 1)
    {
        _dbSet.Add(entity);
        return;
    }

    var attachedEntity = _dbSet.Local.SingleOrDefault(e => e.Id == entity.Id);
    if (attachedEntity != null)
        _dbContext.Entry(attachedEntity).State = EntityState.Detached;
    entry.State = EntityState.Modified;
}

Puede encontrar el problema en los comentarios del siguiente código

 using (var uow = ObjectFactory.GetInstance<IUnitOfWork>()) // uow is implemented like EFUnitOfWork which gives the DbContext instance to repositories in GetRepository
 {
    var userRepo = uow.GetRepository<IUserRepository>();

    var user = userRepo.Get(1);
    user.Name += " Updated";

    userRepo.Save(user);
    uow.Save(); // OK only the Name of User is Updated 
 }

 using (var uow = ObjectFactory.GetInstance<IUnitOfWork>())
 {
    var userRepo = uow.GetRepository<IUserRepository>();

    var user = new User 
    {
        Id = 1,
        Name = "Brand New Name"
    };

    userRepo.Save(user);
    uow.Save();

    // NOT OK
    // All fields (Name, Surname, BirthDate etc.) in User are updated
    // which causes unassigned fields to be cleared on db
 }

La única solución que se me ocurre es crear Entidades a través de un repositorio comouserRepo.CreateEntity(id: 1) y el repositorio devolverá una Entidad que se adjunta a DbContext. Pero esto parece propenso a errores, aún cualquier desarrollador puede crear una entidad usandonew palabra clave.

¿Cuáles son sus sugerencias de solución sobre este problema en particular?

Nota: Ya conozco las desventajas y las ventajas de usar un GenericRepository y una interfaz de IEntity. Por lo tanto, los comentarios "no usan un GenericRepository, no uses un IEntity, no pongas una identificación larga en cada Entidad, no hagas lo que estás tratando de hacer".

Respuestas a la pregunta(3)

Su respuesta a la pregunta