Entity Framework가 항상 데이터베이스에서 업데이트 된 데이터를 가져 오도록 강제하는 방법은 무엇입니까?


91

내가 사용하고 EntityFramework.Extended의 일괄 업데이트를 수행하는 라이브러리를. 유일한 문제는 EF가 라이브러리에서 수행 한 일괄 업데이트를 추적하지 않는다는 것입니다. 따라서 DbContext다시 쿼리 하면 업데이트 된 항목이 반환되지 않습니다.

AsNoTracking()쿼리하는 동안 메서드를 사용하면 추적이 비활성화되고 데이터베이스에서 새로운 데이터를 가져 오는 것으로 나타났습니다 . 그러나 EF는로 쿼리 된 엔터티를 추적하지 않기 때문에 AsNoTracking()쿼리 된 데이터에 대한 업데이트를 수행 할 수 없습니다.

변경 사항을 추적하는 동안 EF가 최신 데이터를 가져 오도록 강제하는 방법이 있습니까?


2
이에 29K 전망 만 19 upvotes은 ... 음, 어쨌든 내 추가
jleach

답변:


152

단일 항목을 새로 고치려면 다음을 시도하십시오.

Context.Entry<T>(entity).Reload()

편집 : 엔터티 컬렉션에 대한 새로운 데이터를 얻으려면 DbContext각 요청 후에 인스턴스 를 폐기하는 것이 좋습니다.


감사합니다! 하나가 아닌 엔티티 모음을 다시로드하는 방법이 있습니까? 바람직하게는 전체 DbSet.
Saravana 2014 년

이것이 답으로 간주되기 위해 필요한 다른 것이 있습니까?
PlTaylor

1
예, 여전히 엔티티 컬렉션을 다시로드하는 방법은 표시되지 않습니다.
Saravana 2014 년

1
dbcontext를 폐기하고 새로 만들려고 했습니까?
PlTaylor 2014 년

3
이 결론에 도달하는 데 몇 시간이 걸렸습니다. 그 편집 이 질문에 대해 답이 내 해결책을 찾는 데 도움 것입니다. 감사!
BeemerGuy

17

엔터티를 업데이트 한 후 탐색 속성이 채워지지 않는 문제에 대한 해결책을 찾는 동안이 질문을 발견했습니다. 데이터베이스에서 엔터티를 다시로드하려고 할 때마다 지연로드를 통해 탐색 속성을 채우지 않는 대신 로컬 저장소에서 항목을 가져옵니다. 컨텍스트를 파괴하고 다시 만드는 대신 프록시가 작동하는 새로운 데이터를 얻을 수 있다는 것을 알았습니다.

_db.Entry(entity).State = EntityState.Detached;

그 논리는 내 업데이트가 엔티티를 첨부하여 변경 사항을 추적한다는 것입니다. 이렇게하면 로컬 상점에 추가됩니다. 그 후 기능 프록시를 사용하여 엔티티를 검색하려는 시도는 db로 이동하여 새로운 프록시 사용 엔티티를 반환하는 대신 로컬 프록시를 가져 오게됩니다. 데이터베이스에서 개체를 새로 고치는 위의 다시로드 옵션을 시도했지만 지연로드로 프록시 된 개체를 제공하지 않습니다. 나는 Find(id), Where(t => t.Id = id), First(t => t.Id = id). 마지막으로 제공된 사용 가능한 상태를 확인하고 "분리 된"상태가 있음을 확인했습니다. 유레카! 이것이 누군가를 돕기를 바랍니다.


지연로드가 작동하도록하려면 Detached 상태를 어디에 적용합니까? 나는 당신의 해결책을 시도했지만 그것은 저에게 효과가 없었습니다. 당신의 도움을 주시면 감사하겠습니다
렉스

2
나는 그것을 알아 냈다 : 1. 엔티티를 저장하고, 2. 상태를 분리됨으로 설정하고, 3. db에서 엔티티를 읽습니다. 힌트 주셔서 감사합니다!
Rex

1

동일한 컨텍스트에서 코드를 실행하면 업데이트 된 엔터티가 생성되지 않습니다. 실행 사이에 데이터베이스에 생성 된 새 엔티티 만 추가합니다. EF 강제 재로드는 다음과 같이 수행 할 수 있습니다.

ObjectQuery _query = Entity.MyEntity;
_query.MergeOption = MergeOption.OverwriteChanges;
var myEntity = _query.Where(x => x.Id > 0).ToList();

1

클래스의 일부로 할당없이 엔티티 변수를 선언했습니다. 이를 통해 다른 메서드에서 참조 할 수 있도록 변수를 잃지 않고 인스턴스를 처리 할 수있었습니다. 나는 방금 이것을 보았으므로 벨트 아래에 많은 런타임이 없지만 지금까지 잘 작동하는 것 같습니다.

public partial class frmMyForm
{
    private My_Entities entity;

    public frmMyForm()
    {
        InitializeComponent();
    }

    private void SomeControl_Click(object sender, EventArgs e)
    {
        db.SaveChanges();
        db.Dispose();
        entity = new My_Entities();
        //more code using entity ...
}

0

나를 위해 ... 다음과 같이 내 DbContext에 액세스합니다.

_viewModel.Repo.Context

EF가 데이터베이스에 도달하도록 강제하려면 다음을 수행합니다.

_viewModel.Repo.Context = new NewDispatchContext();

현재 DbContext를 새 인스턴스로 덮어 씁니다. 그런 다음 다음에 내 데이터 서비스를 사용할 때 데이터베이스에서 데이터를 가져옵니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.