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

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

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

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



답변

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

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

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


답변

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

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

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


답변

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

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


답변

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

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 ...
}


답변

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

_viewModel.Repo.Context

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

_viewModel.Repo.Context = new NewDispatchContext();

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


답변