0

이 쿼리에서보세요 :EntityFramework의 NullReferenceException은 어떻게 생깁니 까?

var user = GetUser(userId); 
var sessionInvites = ctx.SessionInvites 
    .Include("InvitingUser") 
    .Include("InvitedUser") 
    .Where(e => e.InvitedUser.UserId == user.UserId) 
    .ToList(); 

var invites = sessionInvites; 

// Commenting out the two lines below, and it works as expected. 
foreach (var invite in sessionInvites) 
    ctx.DeleteObject(invite); 

ctx.SaveChanges(); 

return invites; 

지금, 여기에 모든 오류없이 실행합니다. 사용자에 대해 존재하는 초대가 삭제되고 초대가 성공적으로 반환됩니다.

그러나 반환 된 초대에서 InvitingUser 또는 InvitedUser으로 이동하려고하면 NullReferenceException이 표시됩니다. 반환 된 SessionIvites의 다른 모든 속성은 정상적으로 작동합니다.

어째서?

[편집] 이제 이상한 것은 내가 줄을 주석으로 처리하면 예상대로 작동한다는 것입니다. (엔티티가 삭제되지 않는 것을 제외하고 : S)

답변

3

EF는 EF가 널 (NULL) 입력 가능한 모든 FK를 null로 설정하므로 모든 연관 (InvitingUser/InvitedUser)이 사라집니다.

내 가정은 당신의 구조는 다음과 같은 점이다 (카디널리티)

SessionInvites

(0-1) FK-> InvitingUser

(0-1) FK-> InvitedUser

그 결과로

. 당신은 DeleteObject 매크로 EF는 InvitingUser/InvitedUser에 naivigation 속성을 null로 할 것이다 호출하면

Deleting Objects

+0

InvitingUser/InvitedUser는 탐색 속성이며 EF에서는 Nullable로 설정할 수 없습니다. – Mickel

+0

그들은 FK에 묶여 있거나, 기사를 읽거나, 단지 테스트 프로젝트를 생성하는 NAV 프로퍼티입니다. DeleteObject를 호출하면, 그것이 할 수있는 FK를 null로 만듭니다. – Nix

+0

그는 "0 .. * 또는 0..1 카디널리티"를 의미한다고 생각합니다. "nullable"과 같은 의미는 아니지만 아이디어를 얻습니다 ... @Nix는 맞습니다. 관계는 EF에서 일급 주체입니다. 개체를 삭제하면 관계도 그대로 유지됩니다. 상대방에 또 다른 물건이 있다는 것을 기억하십시오. 해당 객체는 삭제 된 객체와 관계를 가질 수 없습니다. –

0

제발, 예외 텍스트를 게시하십시오. e.InvitedUser nullable입니까? 이 부분은 의심스러워 보입니다 : e.InvitedUser.UserId

+0

e.InvitedUser는 널 입력이 가능하지 않습니다. 위에서 언급 한 경로 중 하나에 액세스하려고하면 NullReferenceException 및 "instance not set to instance ..."를 제외하고 예외 텍스트가 없습니다. – Mickel

+0

나는 한밤중에 깨어났다면 NRE를위한 텍스트가 무엇인지 말할 것입니다. 가능한 한 많은 세부 사항을 알려주십시오. 스택 추적은 그 중 하나입니다. 오류가 발생한 곳의 줄 번호를 제공합니다. – Andrey

관련 문제