programing

엔티티 프레임워크 컨텍스트 새로 고침?

i4 2023. 4. 26. 22:57
반응형

엔티티 프레임워크 컨텍스트 새로 고침?

컨텍스트를 새로 고치려면 어떻게 해야 합니까?데이터베이스의 보기를 기반으로 엔티티가 있으며 보기에 대한 탐색 속성이 있는 하나의 테이블 엔티티를 업데이트했을 때 엔티티는 업데이트되었지만 보기가 새 업데이트에 따라 새로 고쳐지지 않습니다...DB에서 데이터를 다시 얻고 싶을 뿐입니다.감사합니다!

컨텍스트에서 엔티티를 새로 고치는 가장 좋은 방법은 컨텍스트를 폐기하고 새 컨텍스트를 만드는 것입니다.

엔티티를 새로 고쳐야 하고 DbContext 클래스와 함께 CodeFirst 접근 방식을 사용하는 경우,

    public static void ReloadEntity<TEntity>(
        this DbContext context, 
        TEntity entity)
        where TEntity : class
    {
        context.Entry(entity).Reload();
    }

컬렉션 탐색 속성을 다시 로드하려면 다음을 사용할 수 있습니다.

    public static void ReloadNavigationProperty<TEntity, TElement>(
        this DbContext context, 
        TEntity entity, 
        Expression<Func<TEntity, ICollection<TElement>>> navigationProperty)
        where TEntity : class
        where TElement : class
    {
        context.Entry(entity).Collection<TElement>(navigationProperty).Query();
    }

참조: https://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbentityentry.reload(v=vs.113).aspx#M:System.Data.Entity.Infrastructure.DbEntityEntry.Reload

yourContext.Entry(yourEntity).Reload();

DbContextApi를 사용하여 특정 엔터티를 다시 로드하려면 RX_DID_RX가 이미 응답을 제공했습니다.

로드한 모든 엔티티를 다시 로드/새로 고침하려면 다음을 수행합니다.

Entity Framework 4.1+(EF5 또는 EF6)를 사용하는 경우 DbContext API:

public void RefreshAll()
{
     var entitiesList = ctx.ChangeTracker.Entries().ToList();
     foreach (var entity in entitiesList)
     {
           entity.Reload();
     }
}

엔티티 프레임워크 4(ObjectContext API)를 사용하는 경우:

public void RefreshAll()
{
     // Get all objects in statemanager with entityKey
     // (context.Refresh will throw an exception otherwise)
     var refreshableObjects = (from entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted
                                               | EntityState.Modified
                                               | EntityState.Unchanged)
                                      where entry.EntityKey != null
                                      select entry.Entity);
 
     context.Refresh(RefreshMode.StoreWins, refreshableObjects);
}

어쨌든 가장 좋은 조언은 "짧은 시간의 맥락"을 사용하는 것입니다. 그러면 여러분은 이런 종류의 문제를 피할 수 있을 것입니다.

저는 그 문제에 대해 몇 편의 기사를 썼습니다.

https://christianarg.wordpress.com/2013/06/13/entityframework-refreshall-loaded-entities-from-database/

새로 고침 방법 사용:

context.Refresh(RefreshMode.StoreWins, yourEntity);

또는 현재 컨텍스트를 삭제하고 새 컨텍스트를 만듭니다.

맥락.저는 MVC 4, EF 5에서 Reload()가 작동하지 않아서 이렇게 했습니다.

context.Entry(entity).State = EntityState.Detached;
entity = context.Find(entity.ID);

그리고 그것은 잘 작동합니다.

EF 6

제 시나리오에서는 Entity Framework가 새로 업데이트된 데이터를 가져오지 않았습니다.데이터가 범위를 벗어나 업데이트되었기 때문일 수 있습니다.가져오기 후 데이터를 새로 고치면 문제가 해결되었습니다.

private void RefreshData(DBEntity entity)
{
    if (entity == null) return;

    ((IObjectContextAdapter)DbContext).ObjectContext.RefreshAsync(RefreshMode.StoreWins, entity);
}

private void RefreshData(List<DBEntity> entities)
{
    if (entities == null || entities.Count == 0) return;

    ((IObjectContextAdapter)DbContext).ObjectContext.RefreshAsync(RefreshMode.StoreWins, entities);
}

성능 손실로 인해 다시 로드를 사용하여 DB 컨텍스트를 새로 고치는 방법은 권장되지 않습니다.각 작업을 실행하기 전에 DB 컨텍스트의 새 인스턴스를 초기화하는 것이 좋습니다.또한 각 작업에 대한 최신 컨텍스트를 새로 고칩니다.

using (YourContext ctx = new YourContext())
{
   //Your operations
}

언급URL : https://stackoverflow.com/questions/20270599/entity-framework-refresh-context

반응형