2011-12-08 2 views
8

MVC 프로젝트가 있고 데이터베이스에 Entity Framework Code First 및 POCO 개체를 사용하고 있습니다. 예 :Entity Framework에서 관련 엔터티를 업데이트하는 방법

public class ClassA 
{ 
    public int? Id {get; set;} 
    public string Name { get; set;} 
    public virtual ClassB B {get; set;} 
} 

public class ClassB 
{ 
    public int? Id {get;set;} 
    public string Description {get;set;} 
} 

나는 모델을 만들거나 편집하는 ActionResult가 있습니다. 문제는이 ActionResult를 호출하여 모델을 업데이트하고 model.B이 변경 되었기 때문에 관계가 데이터베이스에 저장되지 않습니다. ActionResult를 호출하여 새 객체를 만들면 예상대로 작동합니다. 어떻게 해결할 수 있습니까?

public ActionResult Save(ClassA model) 
{ 
    model.B = GetBFromDb(model.B.Id.Value); 

    if(ModelState.IsValid) 
    { 
    if (id.HasValue) 
    { 
     context.Entry(model).State = System.Data.EntityState.Modified; 
    } 
    else 
    { 
     context.ClassAs.Add(model); 
    } 
    context.SaveChanges(); 
    // redirect to index etc. 
    } 
    return View("EditForm", model); 
} 

답변

3

내가 ClassB에 외래 키와 ClassA을 변경하여 그것을 해결의 부착 및 BId의 값을 설정 :

public class ClassA 
{ 
    public int? Id {get; set;} 
    public string Name { get; set;} 
    public int BId {get;set;} // foreign key to B 
    public virtual ClassB B {get; set;} 
} 

왜이 외래 키 속성은 EF의 생성 외국 켄터키 대신 일을합니까?

+3

이 연결 해제 된 상태에서 외래 키가없는 경우 일부가 있습니다 EF가 해결할 수없는 격차 & 여분의 코드를 입증해야합니다. 그렇지 않으면 관계를 볼 수 없습니다. FK 속성을 사용하면 스칼라 값이며 EF가 여러 프로세스를 쉽게 추적 할 수 있습니다. 나는이 정확한 주제에 대해 2012 년 1 월 Data Points 칼럼을 실제로 작성했습니다! EF는 FK 스칼라 속성이있을 때 훨씬 쉽게 사용할 수 있습니다. 그렇지 않으면 "작동하도록"기대하는 많은 기능을 사용하여 진행 상황과 필요한 정보를 제공하는 방법을 더 잘 이해할 수 없습니다. 죄송합니다 –

+0

전에 줄 잃은 FK를 보지 못했습니다 .JLieieLerman, 문제 없어요, 당신의 도움에 감사드립니다! :) – Marthijn

2

당신은 단순히 호출 할 수 없습니다 :

context.Entry(model).State = System.Data.EntityState.Modified; 

기업은 EF가 추적을 시작할 수 있습니다 첫째 있도록 문맥에서 검색해야합니다. 그런 다음 context.SaveChanges()을 호출하기 전에 해당 엔티티에 변경 사항을 적용하려고합니다.

var entity = context.ClassAs.Find(model.Id); 

// set properties you want to modify on entity 
entity.Name = model.Name; 
entity.ClassB = context.ClassBs.Find(model.ClassB.Id); 
// other changes to entity as required... 

context.SaveChanges(); 

이렇게하면 EF는 entity을 추적하고 그것에 대해 업데이트를 적용합니다.

+0

고맙습니다. 그리고 어떻게 설정합니까'entity.ClassB = null;'? null로 설정하면 작동하지 않는 것 같습니다. – Marthijn

+1

yuck ... context.Entry (model) .State는 컨텍스트가 모델을 추적 중인지 여부를 확인하고 그렇지 않은 경우 추적을 시작합니다. 모델 인스턴스를 추적하기 위해 다른 db 쿼리를 실행할 필요가 없습니다. Henkie가 그 문제를 가지고있는 문제는 Entry가 전달한 엔티티의 상태를 변경하는 것만을 Entry라고합니다. "수정 된"상태 설정은 그래프의 나머지 부분에 적용되지 않습니다. –

+0

@JulieLerman 감사합니다. 튜토리얼을 찾았으니 State를 Modified로 설정했습니다. 그렇지만 관계가 업데이트되지 않는 문제가 여전히 남아 있습니다. – Marthijn

0

수정 한 상태로 연결하고 상태를 설정하면 엔티티 프레임 워크가 업데이트를 위해 모든 속성을 보냅니다. 전체적으로 별도의 부하가 발생하기 때문에 아래에서 수달 접근법을 취할 필요가 없습니다. 그렇게하면 모델을 전달하는 데 아무런 의미가 없습니다. ID 만 사용한 다음 TryUpdateModel을 호출하여 양식의 속성을 채 웁니다. 조금 청소기 여기 수정으로 완전한 왕복을 필요로하지 않는

개인적으로 인해 데이터로드

http://geekswithblogs.net/michelotti/archive/2009/11/27/attaching-modified-entities-in-ef-4.aspx

관련 문제