2017-09-29 4 views
1

EF에서 다소 이상한 문제가 있습니다. MfgSite가 각 시나리오와 관련된 시나리오 목록을 표시하고 있습니다. 아래 모델입니다 : 나는 다음이 코드가 내 시나리오 컨트롤러 색인 작업에서엔티티 프레임 워크가 하위 개체를 null로 설정합니다.

//Models 
public partial class Scenario 
{ 

    public string Name { get; set; } 
    public bool IsFinal { get; set; } 
    public Guid Uid { get; set; } 
    public string Username { get; set; } 
    public string Description { get; set; } 
    public Guid MfgSiteUid { get; set; } 

//navigation property 
    public MfgSite MfgSiteU { get; set; } 

} 


public partial class MfgSite 
{ 
    public string MfgSiteCommonName { get; set; } 
    public string MfgSiteState { get; set; } 
    public string MfgSiteFunction { get; set; } 
    public string MfgSiteDesc { get; set; } 
    public Guid Uid { get; set; } 

//navigation property 
    public Scenario Scenario { get; set; } 
} 

(내가 처음 Scaffold-DbContext를 사용하여 DB에서 모델을 생성합니다). 반환 된 목록에는 시나리오의 각 고유 MfgSiteUid에 대해 하나의 항목을 제외한 MfgSiteU가 모두 null로 설정됩니다.

//Scenario Controller Index Action 
public async Task<IActionResult> Index() 
{ 
     var sContext = _context.Scenario.Include(s => s.MfgSiteU); 
     return View(await sContext.ToListAsync()); 
} 

보기에 표시 할 때 (모든 열 표시가)는 다음과 같습니다 다음 s.MfgSiteU이 s.MfgSiteUid 정확하고 null이 아닌 경우에도 널이기 때문에 enter image description here

빈 열이 있습니다. MfgSiteCommonName은 두 번째 행의 경우 "Test Site 1"이어야하고 세 번째 및 네 번째 행의 경우 'Test Site 2'여야합니다.

이 문제의 원인은 무엇이고 잠재적 수정은 무엇입니까? 디버깅의 일환으로 DbSet에서 foreach를 사용하여 한 번에 하나의 시나리오를 탐색하고 각 시나리오를 수동으로 목록에 추가하려고했습니다. MfgSiteU가 개별 객체에서 null이 아니라는 것을 알 수 있습니다. 그러나 끝 부분을 반복하면 MfgSiteU가 이전 객체를 null로 재설정하는 방법도 있습니다.

+1

(생성 된) 관계가 잘못되었습니다. 여러분의 데이터에 따르면, MfgSite는 일대 다'Scenario' (MfgSite의 네비게이션 속성은'public ICollection Scenarios {get; set;}' –

+1

@IvanStoev, 탁월한 캐치! Scaffold-DbContext 생성 방법에 대해 당황 스러웠습니다 1-1. FK가 시나리오 표에 나와 있으므로 컬렉션을 생성해야합니다. 수동으로 모델을 수정했는데 문제가 해결되었습니다. 이 질문을 답으로 게시 할 수 있다면 기꺼이 받아 들일 것입니다. – user3885927

답변

2

이 문제의 원인은 무엇이고 잠재적 수정은 무엇입니까?

문제는 측정 데이터에 의하면, MfgSiteScenario과 관계가 있다는 대일, 상기 생성 된 관계가있을 일대일. EF Core는 관련 데이터를로드하는 데 필요한 SQL 조인을 생성 할 때 관계 카디널리티를 사용하므로 관계가 올바르게 매핑되지 않은 경우 잘못된 결과가 발생할 수 있습니다. 발판 명령이 잘못된 관계를 만든 이유

수정이 현재

public ICollection<Scenario> Scenarios { get; set; } 

public Scenario Scenario { get; set; } 

에서 MfgSite의 탐색 속성을 대체하는 것입니다, 나는하지 않고 대답 할 수없는 데이터베이스 모델 문제를 재현하는 샘플 데이터베이스를 제공 할 수있는 경우 EFC 문제 추적 프로그램에서 문제를 열 ​​것을 제안합니다.