Проблема с этим решением состоит в том, что он принимает во внимание только обновление, но такая же проблема возникает для вставки в новый объект. Если вы вставите объект, который связан с другими отделенными объектами, которые уже существуют в базе данных (которые, в свою очередь, могут быть связаны с другими объектами / подобъектами), все эти объекты будут воссозданы. Какой кошмар. Это кажется таким ненужным поведением, особенно потому, что все эти отсоединенные объекты имеют свойства гидратированного идентификатора, поэтому было бы действительно легко обнаружить, что они уже были загружены в предыдущем вызове.

я есть такой репозиторий:

public class Repository<T> : IRepository<T> where T : class 
{
    private readonly IRepositoryContext _repositoryContext;

    public Repository(IRepositoryContext repositoryContext)
    {
        _repositoryContext = repositoryContext;
        _objectSet = repositoryContext.GetObjectSet<T>();
    }

    public virtual void Update(T entity)
    {
        ObjectSet.AddObject(entity);
        _repositoryContext.ObjectContext.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
        _repositoryContext.SaveChanges();
    }
  }

Теперь это на самом деле работает для всех скалярных свойств объекта, но для всех других объектов, связанных со свойствами объектаtypeOf(T)Мне все равно, что состояние объекта изменяется, а EF просто добавляет новые данные.

Итак, если вы делаете, например,Repository<Student>.Update(), и вы только изменили имя, он найдет нужного студента и изменит его имя, но также изменит кампус, хотя у вас уже есть кампус, связанный с этим студентом, он будет снова создан с другим идентификатором CampusId.

Покажите мне пожалуйста правильный способ делать обновления в этой ситуации.

Ответы на вопрос(1)

Ваш ответ на вопрос