2011-02-07 7 views
0

제목에서 언급했듯이 몇 가지 방법을 사용할 수 있습니까?anthoer ObjectContext에서 분리 된 엔티티 객체를 연결하는 가장 좋은 방법은 무엇입니까?

나는이 경우를 가지고있다 : 한 ObjectContext에서 엔티티 객체를 얻은 다음 OjbectContext 객체에서 엔티티 obejct를 분리하고 리턴한다.

나중에이 개체를 약간 변경하면 데이터베이스에 변경 내용을 다시 저장하고 싶습니다. 이런 식으로 써야한다고 생각해. 그렇지? (음, 이것은 나를 위해 작동합니다.)

public Url GetOneUrl() 
{ 
    Url u; 
    using(ServicesEntities ctx = new ServicesEntities()) 
    { 
     u = (from t in ctx.Urls select t).FirstOrDefault<Url>(); 
     ctx.Detach(u); 
    } 
    return u; 
} 

public void SaveToDB(Url url) 
{ 
    using(ServicesEntities ctx = new ServicesEntities()) 
    { 
     var t = ctx.GetObjectByKey(_Url.EntityKey) as Url; 
     ctx.Detach(t); 
     ctx.Attach(url); 
     ctx.ObjectStateManager.ChangeObjectState(url, System.Data.EntityState.Modified); 
     ctx.SaveChanges(); 
    } 
} 

Url url = GetOneUrl(); 
url.UrsString = "http://google.com"; //I just change the content. 
SaveToDB(url); 

또는

public void SaveToDB(Url url) 
{ 
    using(ServicesEntities ctx = new ServicesEntities()) 
    { 
     var t = ctx.GetObjectByKey(_Url.EntityKey) as Url; 
     t = url; //this will make t.UrlString becomes "http://google.com" 
     ctx.ApplyCurrentValues<Url>("Urls", t); 
     ctx.SaveChanges(); 
    } 
} 

이 방법은 또한 나를 위해 작동합니다.

첫 번째 방법은 SQL 문을 생성하여 URL 테이블의 모든 열을 업데이트하지만 두 번째 방법은 SQL 스크립트가 "UrlString"열만 업데이트하도록합니다.

둘 다 위의 코드에서 't'인 데이터베이스에서 임시 엔티티 개체를 검색해야합니다.

이 목적을 달성하는 다른 방법이 있습니까? 또는 당신이 그것에 대해 알고있는 다른 더 나은 방법? 또는이 주제에 관한 공식 해결책?

많은 감사.

답변

0

첫 번째 예제를 이해하지 못합니다. 왜 처음 엔 엔티티를 ObjectContext에서 얻나요? 방금 컨텍스트의 새 인스턴스를 만들었으므로 필요하지 않습니다. 당신은 사용할 수 있습니다

public void SaveToDB(Url url) 
{ 
    using(ServicesEntities ctx = new ServicesEntities()) 
    { 
     ctx.Attach(url); 
     ctx.ObjectStateManager.ChangeObjectState(url, System.Data.EntityState.Modified); 
     ctx.SaveChanges(); 
    } 
} 

을 두 번째 예에서 방금 호출 할 수 있습니다

public void SaveToDB(Url url) 
{  
    using(ServicesEntities ctx = new ServicesEntities())  
    {   
    var t = ctx.GetObjectByKey(_Url.EntityKey) as Url; // Ensures that old values are loaded 
    ctx.ApplyCurrentValues<Url>("Urls", url);   
    ctx.SaveChanges();  
    } 
} 

지금 두 가지 접근 방식의 차이는 분명하다. 첫 번째 방법 ( Attach)은 먼저 DB를 쿼리 할 필요가 없습니다. 두 번째 방법 ( ApplyCurrentValues)은 먼저 DB에 쿼리하여 오래된 값을 가져와야합니다.

두 가지 접근 방법을 추가로 사용할 수 있습니다. First은 이전 방식의 확장입니다. 이를 통해 어떤 속성이 변경되었는지 정의 할 수 있습니다. 두 번째 방법은로드 된 엔터티와의 수동 동기화입니다. 이 방법은 특별한 방법을 사용하지 않습니다. 로드 된 엔티티의 속성을 수동으로 필수 값으로 설정하기 만하면됩니다. 이 방법은 EF가 관계의 변경 사항을 자동으로 동기화 할 수 없기 때문에 단일 항목 대신 오브젝트 그래프로 작업 할 때 유용합니다.

+0

안녕 Ladislan, 답장을 보내 주셔서 감사합니다. 하지만 'ObjectContext는 동일한 EntityKey를 가진 두 개의 엔티티 객체를 가질 수 없습니다'와 같은 첫 번째 코드 던져 예외가 발생합니까? 나는 새로운 ObjectContext 인스턴스에 엔티티를 직접 부착 할 때 항상이 예외를 얻는다. –