0

다음 모델이 있다고 가정합니다.여러 외래 키 데이터 모델이 C# mvc 컨텍스트를 사용하여 EF에서 업데이트 됨

public class modelA 
{ 
    [Key] 
    public int ID {get; set;} 
    public string Name {get; set;} 
} 

public class modelB 
{ 
    [key] 
    public int ID {get; set;} 
    public string Name {get; set;} 
    public modelA modelAID {get; set;} 
} 

public class modelC 
{ 
    [key] 
    public int ID {get; set;} 
    public string Name {get; set;} 
    public modelA modelAID {get; set;} 
    public modelB modelBID {get; set;} 
} 

이제 modelC를 삽입하는 컨트롤러 동작이 있습니다.

public ActionResult addModelC() 
{ 
    modelA dbModelA = db.modelAs.FirstOrDefault(); 
    modelB dbModelB = db.modelBs.FirstOrDefault(); 

    modelC newModelC = new modelC(); 
    newModelC.Name = "New Model C"; 
    newModelC.modelAID = dbModelA; 
    newModelC.modelBID = dbModelB; 

    db.modelCs.Add(newModelC); 
    db.SaveChanges(); //DbEntityValidation error on dbModelB.modelAID empty because its not included when db.modelBs query was called 
} 

나는() saveChanges를 새로운 기록을 만들려고합니다 db.modelBs EF의 열망로드 modelAID을 해달라고합니다. 이것을 막는 방법?

modelC을 어떻게 추가 할 수 있습니까? (열렬한로드) modelA 및 modelB. 외래 키 관계 만 추가하면됩니다. 여기 SaveChanges 또한 modelA 및 modelB 업데이트하려고하지만 그 업데이트 싶지 않아요. 나는 EF가 모든 것을 알아야 할 필요가 있음을 압니다. 그러나 대대적 인 기록으로 열심히로드하는 것은 기억 문제를 일으킬 수 있습니다.

db.modelCs.include(i=>i.modelAID).include(i=>i.modelBID).ToList(); 

modelAID modelBID를 내부 조인 할 필요가 없다면. 모델 C 만 보여줍니다.

또한 modelC를 JSON 객체로 반환하는 경우 모델 B에서 modelAID를 반복하고 모델 C에서 하나를 반복하기 때문에 원형 참조가 발견됩니다. 나는 그것을 분명히하기를 희망한다.

참고 : 코드를 처음 사용하는 방법. [메모리에서]

+0

외래 키는 일반적으로 '가상'키워드를 사용하여 생성됩니다. 귀하의 예제에서, 나는 당신이 사용해야합니다 용의자 :'public virtual modelA modelAID {get; 세트; }' – peval27

+0

가상을 사용하면 지연로드가 시작됩니다. 내가 원하는 것은 관련 객체를로드하지 않는 것입니다. –

답변

0

당신은 modelC를 만들 때이 함께

// Foreign key 
public int modelAID { get; set; } 

// Navigation properties 
public virtual ModelA ModelA { get; set; } 

https://msdn.microsoft.com/en-us/library/jj679962(v=vs.113).aspx#Anchor_2 그래서, 당신은 단지 modelAID = modelA.Id과의 관계를 할당해야 당신이 연결할 수 있도록 FK 규칙을 사용할 필요가 설정됩니다. 그런 다음 modelC을로드 할 때 ModelA (N + 1 시나리오에주의) 또는 EF에 ModelA를 강제로로드하도록 허용하거나 .include

+0

나는 위에서 언급 한대로 modelB를 만들었습니다. 내 데이터베이스 ForeignKey 열을 modelAID_ID에서 modelAID로만 변경합니다. 여전히 변경 사항을 저장할 때 modelAID db.modelBs.include ("modelAID")를 포함하지 않으면 새로운 modelA를 작성하려고 시도하고 기본 키가 이미 데이터베이스에 있다고합니다. 왜 내가 포함시켜야하는지. ModelB에서 modelA 필요 없다 modelC에 modelA가 있습니다. 두 모델 모두 modelC와는 다른 관계가 있습니다. –