Получение нового значения RowVersion с использованием Entity Framework 6

asp.net-mvc asp.net-mvc-5 entity-framework entity-framework-6

Вопрос

Возможно ли, чтобы получить новое значение RowVersion с использованием одного и того же DbContext, без перезагрузки объекта из базы данных?

Сценарий:

  • Загрузка данных в форму редактора
  • Сохранить новые значения
  • Строка в таблице обновляется, генерируется новое значение RowVersion
  • Однако сохраненный объект все еще сохраняет старое значение RowVersion, поэтому новое значение не может быть передано клиенту

Все статьи контроля параллельности обычно касаются только предотвращения обновления (например, см. Это ). Однако в примере из статьи за успешным обновлением следует перенаправление на страницу, где сохраненный объект читается снова, и теперь он имеет новое значение RowVersion. Я бы хотел избежать этого перенаправления.

Принятый ответ

Благодаря grennis, я выяснил источник моих проблем.

Я определил интерфейс и объект вроде

public interface IRowVersion
{
    // Attention: this will not be "inherited" by the implementing class !!!
    [Timestamp]
    byte[] VersionStamp { get; set; }
}

public class Directory : IRowVersion
{
    [Key]
    public int Id { get; set; }

    public string Title { get; set; }
    public string Description { get; set; }

    // If this attribute is missing here, then row version is used
    // My initial version was without this attribute
    [Timestamp]
    public byte[] VersionStamp { get; set; }
}

В моей проблемной версии я думал, что достаточно иметь атрибут свойства интерфейса. Однако атрибут должен быть явно применен к свойству объекта. В противном случае он вообще не будет использоваться (даже не как часть инструкции SQL-запроса обновления). Значение было обновлено только потому, что DB обновляет значение столбца автоматически и, конечно, при следующем чтении я получил новое значение.

Не совсем связано с проблемой, но все же стоит упомянуть ... Следующее действительно является функцией убийцы EF6

public interface IRowVersion
{
    // Attention: this will not be "inherited" by the implementing class !!!
    [Timestamp]
    byte[] VersionStamp { get; set; }
}

public class Directory : IRowVersion
{
    [Key]
    public int Id { get; set; }

    public string Title { get; set; }
    public string Description { get; set; }

    // If this attribute is missing here, then row version is used
    // My initial version was without this attribute
    [Timestamp]
    public byte[] VersionStamp { get; set; }
}

SQL Profiler, было приятно узнать вас :-)




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему