2017-12-19 1 views
1

없이 dbset의 레코드를 찾기나는 <code>Student</code> 테이블이 기본 키

 var currentUserId = User.Identity.GetUserId(); 
     var newid = db.Students.FirstOrDefault(d => d.UserID == currentUserId); 

     if (newid == null) 
     { 
      newid = db.Students.Create(); 
      newid.UserID = currentUserId; 
      db.Students.Add(newid); 

     } 

     Student student = db.Students.Find(newid.UserID); 
     if (student == null) 
     { 
      return HttpNotFound(); 
     } 

내 질문에 내가 기록을 찾을 수 있습니까하지만 그의 기본 키를 사용할 수없는 방법입니다 ? 제 경우에는 IndividualInventoryRecord에 기본 키 RecordID이 있습니다. 내가 FK UserID를 사용하여이 테이블에서 레코드를 찾으려면

나는 이것을 시도했지만 inventory 수익률은 데이터베이스에 저장되지 않으며, 때문에 나는 또한 SingleOrDefault()

+0

만약'.FirstOrDefault() 'null을 반환하면 일치하는 레코드가 발견되지 않았다는 의미입니다. 그것은 성공적으로 작동하고 있습니다, 당신은 단지 데이터에서 제로 결과를 얻고 있습니다. (빈 콜렉션을 성공적으로 반환하는'.Where() '을 사용하는 것과 대조) – David

+0

테이블에 currentUserId를 추가 한 이후로 네,하지만 레코드를 가져 오지 않았습니까? –

+0

방금 ​​추가 한 정확한 물체를 찾고 있다는 것이 이상합니다. 'userInv' 변수에 이미 그 객체가 있습니다. 어쩌면'.SaveChanges()'를 먼저 호출 할 필요가 있을까요? 그렇게 이상하게 만들지는 못하지만 효과가있을 수 있습니다. – David

답변

1

를 사용하여 시도

var userInv = db.IndividualInventoryRecords.FirstOrDefault(d => d.UserID == currentUserId); 

     if (userInv == null) 
     { 
      userInv = db.IndividualInventoryRecords.Create(); 
      userInv.UserID = currentUserId; 
      db.IndividualInventoryRecords.Add(userInv); 
     } 

     IndividualInventoryRecord inventory = db.IndividualInventoryRecords.FirstOrDefault(user => user.UserID == currentUserId); 

     if (inventory == null) 
     { 
      return HttpNotFound(); 
     } 

를 널 (null) userInv 인스턴스 그냥 저장하십시오.

if (userInv == null) 
    { 
     userInv = db.IndividualInventoryRecords.Create(); 
     userInv.UserID = currentUserId; 
     db.IndividualInventoryRecords.Add(userInv); 
     db.SaveChanges(); 
    } 
    IndividualInventoryRecord inventory = db.IndividualInventoryRecords.FirstOrDefault(user => user.UserID == currentUserId); 
2

불행하게도 Find 메서드는 로컬 캐시를 고려한 유일한 방법입니다. 모든 표준 Queryable 메서드는 SQL로 변환되어 데이터베이스에서 실행되므로 기존 데이터베이스 테이블 레코드 만 반환합니다.

public static partial class DbSetExtensions 
{ 
    public static T FindFirst<T>(this DbSet<T> source, Expression<Func<T, bool>> predicate) 
     where T : class 
    { 
     return source.Local.AsQueryable().FirstOrDefault(predicate) ?? source.FirstOrDefault(predicate); 
    } 
} 

FirstOrDefault 대신 사용 :이 Find에 있지만 조건식과 유사한 사용자 정의 확장 메서드를 작성하는 것을 어렵지 않다 그러나

var inventory = db.IndividualInventoryRecords.FindFirst(e => e.UserID == currentUserId); 
관련 문제