2016-12-06 1 views
4

저는 2 년 후 Entity Framework를 사용하고 있으며 약간의 문제가 있습니다.방금 ​​추가했지만 저장되지 않은 값에 대한 엔터티 프레임 워크 쿼리

나는

Entities.dbContext.MyTable.Add(obj1); 

여기 확인과 함께, 내 테이블에 엔티티를 추가 할 수 있습니다.

그럼, 위의 코드는 DB를 내을 MyTable에 쿼리합니다

Entities.dbContext.MyTable.Where(.....) 

처럼을 MyTable에 대한 쿼리를하고 싶습니다.

saveChanges 전에 그냥 추가 된 값을 쿼리하는 방법이 있습니까? (obj1) 어떻게?

UPDATE

왜이 필요합니까? 내가 추가 새로운 각 요소에 대해, 내가 이전 및 다음 레코드의 일부 값을 편집 할 필요가 있기 때문에

UPDATE2이

의가 난을 추가해야한다고 가정 해 봅시다 (이 테이블의 날짜 필드가 있습니다) 많은 객체가 있지만 마지막 항목이 추가 된 후에 만 ​​saveChanges를 호출합니다. 새 항목을 추가 할 때마다 datetime 필드를 읽고 이전 및 다음 레코드를 데이터베이스에서 검색합니다. 여기서는 이전 레코드와 다음 레코드의 필드를 편집합니다. 이제, 여기에 문제가 있습니다 : 다른 항목을 삽입하고, 예를 들어, 다음 항목이 "Obj1"인 경우,이를 찾아 편집해야하지만 변경 사항을 저장하지 않았기 때문에 찾을 수 없습니다. 지금은 더 명확한가요?

+2

을 변경? 객체가 이미 있습니다. obj1로 저장됩니다. –

+0

SaveChanges를 호출하자마자 obj1은 기본 키와 같이 방금 저장 한 내용을 포함하게됩니다. 다시 가져올 필요가 없습니다. – Darren

+0

@AlfieGoodacre 질문에 대한 답변을 편집했습니다. –

답변

5

당신은이 같은 변화 추적기를 통해 dbContext에서 당신의 추가 개체를 얻을 수 있어야합니다 :

var addedEntities = dbContext.ChangeTracker.Entries() 
    .Where(x => x.State == EntityState.Added && x.Entity.GetType().Name == "MyTable") 
    .Select(x => x.Entity as MyTable); 

만 추가 엔티티를 조회하고 있기 때문에, 당신은

dbContext.MyTable.Where(x => -criteria-).ToList().AddRange(addedEntities); 
과이 결합 할 수 있습니다

모든 관련 개체를 얻으려면

+1

이것은 좋은 해결책입니다. 그러나 그것은 나를 위해, 작동하지 않았다. 필자의 경우 Entity.GetType(). Name에 GUID가 추가되었습니다. 그래서 BaseType도 고려합니다. (x => x.Status == EntityState.Added && (x.Entity.GetType) == typeof (MyTable) || x.Entity.GetType(). BaseType == typeof (MyTable))) – RitchieD

+0

죄송합니다. 지연. 이 솔루션은 나를 위해 완벽합니다 !!!!!!! –

+0

"addedEntities"에 대해 힌트를 주실 수 있습니까? http://stackoverflow.com/questions/41982691/one-databse-two-applications-two-dbconterxt –

0

나는 이것이 거래에 좋은 상황이라고 생각합니다. 나는 버전을 제공하지 않았기 때문에 EF 6을 사용하고 있다고 가정 할 것입니다. 당신이 원하는 것이 왜 =)

UPDATE2는

public void BulkInsertObj(List<TEntity> objList) 
{ 
    using (var context = new dbContext()) 
    { 
     using (var dbContextTransaction = context.Database.BeginTransaction()) 
     { 
      try 
      { 
       foreach(var obj1 in objList) 
       { 
        dbContext.MyTable.Add(obj1); 

        //obj1 should be on the context now 
        var previousEntity = dbContext.MyTable.Where(.....) //However you determine this 
        previousEntity.field = something 

        var nextEntity = dbContext.MyTable.Where(.....) //However you determine this 
        nextEntity.field = somethingElse 
       } 

       context.SaveChanges(); 
       dbContextTransaction.Commit(); 
      } 
      catch (Exception) 
      { 
       dbContextTransaction.Rollback(); 
      } 
     } 
    } 
} 

MSDN EF6 Transactions

관련 문제