Entity Framework и DetailsView в приложении N-уровня - PullRequest
1 голос
/ 11 августа 2011

Я абсолютно новичок в Entity Framework, поэтому, пожалуйста, не стесняйтесь указывать на любые ошибки.В любом случае я постараюсь описать мою проблему так, как я ее понимаю.

Я создаю n-уровневое приложение с Entity Framework.Я также использую общий репозиторий, как описано в на этой странице .

Мне удалось заполнить DetailsView и вставить значение в базу данных через ObjectDataSource ,Однако проблема, с которой я сталкиваюсь, возникает при обновлении.

Я получаю ошибку:

Не удалось найти объект с ключом, который совпадает с ключом предоставленного объекта.в ObjectStateManager.Убедитесь, что значения ключа предоставленного объекта соответствуют значениям ключа объекта, к которому должны быть применены изменения.

И я понимаю, ПОЧЕМУ это происходит также.Я использую следующие методы для заполнения значений из БД.

public IEnumerable<TEntity> GetAll<TEntity>() where TEntity : class
{
  return GetQuery<TEntity>().AsEnumerable();
}

public List<Company> GetAllCompanies()
{
  return _genericRepository.GetAll<Company>().ToList();
}

Если я ставлю точку останова в методе GetAll и наблюдаю результаты, я вижу, что установлен EntityKey и IsChangeTrackedЗначение true для каждого объекта в списке.

Но если я проверю, передан ли объект UpdateMethod, указанный для ObjectDataSource, то EntityKey равен нулю, EntityState отсоединен и IsChangeTrackedложноТаким образом, поскольку EntityKey имеет значение null, я понимаю, что исключение действительно.

Мой метод обновления выглядит как

public void Update<TEntity>(TEntity entity) where TEntity : class
{
    ObjectSet<TEntity> objSet = DataContext.CreateObjectSet<TEntity>();
    objSet.ApplyCurrentValues(entity);
    SaveChanges();
}

Я пытался присоединить, используя objSet.Attach(entity);, тогда никаких исключений, но объект нелибо получить обновление.

Как правильно выполнить обновление с использованием DetailsView?Или как правильно связать ObjectDataSource с DetailsView?Как мне убедиться, что мой EntityKey не становится нулевым?

1 Ответ

1 голос
/ 11 августа 2011

Решил проблему, используя метод, показанный ниже

public void Update<TEntity>(TEntity entity) where TEntity : class
{
    object originalItem;

    EntityKey key = DataContext.CreateEntityKey(GetEntityName<TEntity>(), entity);

    if (DataContext.TryGetObjectByKey(key, out originalItem))
    {
       DataContext.ApplyCurrentValues(key.EntitySetName, entity);                
    }

    SaveChanges();
}
...