2

웹 응용 프로그램에서 SQL Server 2012와 함께 EF5를 사용하고 있습니다. 저장 단추는 하위 항목 객체와 함께 주제 객체를 눌렀을 때 우리는 웹 API 컨트롤러에 다시 JSON으로 전송 한 후 하위 항목 노트에 변화를 만들어 우리의 프론트 엔드에서웹 API를 사용하면 개체에서 변경된 내용을 Entity Framework에서 어떻게 인식합니까?

public partial class Topic { 
    public Topic() 
    { 
     this.SubTopics = new List<SubTopic>(); 
    } 
    public int TopicId { get; set; } 
    public string Name { get; set; } 
    public int Number { get; set; } 
    public virtual ICollection<SubTopic> SubTopics { get; set; } 
} 

public partial class SubTopic 
{  
    public int SubTopicId { get; set; } 
    public int TopicId { get; set; } 
    public string Name { get; set; } 
    public string Notes { get; set; } 
    public virtual byte[] Version { get; set; } 
    public virtual Topic Topic { get; set; } 
} 

: 나는이 개 수업을 . 무엇이 되돌아 오는 지 확인하면 Notes에 대한 새로운 데이터가 표시됩니다. 매개 변수 토픽을 확인할 때 새로운 Notes 데이터도 볼 수 있습니다.

public HttpResponseMessage PutTopic(int id, Topic topic) 
{ 
     _uow.Topics.Update(topic); 
     _uow.Commit(); 
} 

그러나 SQL 프로파일 러를 검사하면 하위 주제 변경에 아무런 변화가 없습니다. 데이터가 검색되면 이전의 SubTopic 데이터가 반환되고 메모에 대한 편집 내용이 손실됩니다.

이와 같은 웹 업데이트의 경우. EF는 무엇이 변경되었는지를 확인하고 변경 사항을 감지하고 새로운 객체와 비교하여 어떤 점을 비교/비교할 수있는 방법이 있습니까? 하위 토픽을 업데이트 하시겠습니까?

구성 :

DbContext.Configuration.ProxyCreationEnabled = false; 
    DbContext.Configuration.LazyLoadingEnabled = false; 
    DbContext.Configuration.ValidateOnSaveEnabled = false; 
    DbContext.Configuration.ValidateOnSaveEnabled = true; 
    DbContext.Configuration.AutoDetectChangesEnabled = false; 

업데이트 방법는 :

public virtual void Update(T entity) 
    { 
     DbEntityEntry dbEntityEntry = DbContext.Entry(entity); 
     if (dbEntityEntry.State == EntityState.Detached) 
     { 
      DbSet.Attach(entity); 
     } 
     dbEntityEntry.State = EntityState.Modified; 
    } 
+0

objectContext STE 또는 DBContext 변경 추적 프로그램 API를 권장해야한다면 메소드 콘텐츠 업데이트 –

답변

3

ef4.x 이후? EF에는 변경 감지 기능이 있습니다. 오프라인 개체 모드에서 작업 할 수 있습니다.

개체를 컨텍스트에 배치하는 방법과 상태를 관리하는 방법 때문에 UoW 처리가 원하지 않는 것으로 가정합니다.

주요 개체가 개체를 연결 한 다음 상태를 변경 한 상태로 설정하고 있습니다. 그러나 모든 하위 객체는 어떻습니까? 컨텍스트에로드 되었습니까? 자동 감지 변경 사항을 확인해야합니까? 컨텍스트에없는 경우 EF는 변경 사항을 볼 수 없습니다.

EF가 언제 어떻게 변경되는지 추적하는 것이 중요합니다. tracking changes in Poco Objects 자동 감지 설정을 확인하십시오.

this.Configuration.AutoDetectChangesEnabled = false; //// < < < < < < < < < 기본 사실

EF와 함께 작동 패턴은 다음과 같습니다

var mypoco = Context.Set<TPoco>.Find(1); // find and LOAD your poco or sub object poco 
              // repeat for graph or use include etc...  
              // now in context and changes can be tracked. (see link) 
// map json fields to poco entity.... 
myPoco.propertyXyz = json.ValuesSent; // some mapping approach to move your values, I use this package 
// <package id="ValueInjecter" version="2.3.3" targetFramework="net45" /> 

// now tell EF things might have changed. 
// normally not required by default, But incase your are not using tracking proxies , tell ef check for changes 
// Context.Context.ChangeTracker.DetectChanges(); // uncomment when needed 

Context.SaveChanged(); // will trigger detect changes in normal scenarios 

EF가 변경로드 그 실체를 확인, 그것이 원래의 상태를 가지고 처음 부착되었을 때. 이제 어떤 속성이 변경되었는지 확인할 수 있습니다. 변경된 엔티티 만 업데이트되며 변경된 속성 만 설정됩니다.

1

이 문제가 어제 이에 대한 답변 질문과 비슷한 것 같다. 제발 좀 봐 내 answer

+0

을 표시 하시겠습니까? 귀하의 링크는 ObjectContext STE를 제안합니다. 또는 나는 잘못 이해 했는가? 또한 objectContext 및 savechanges에 EntityState.Modified를 설정하면 모든 필드가 변경되었는지 여부에 관계없이 db에 기록됩니다. 새로운 DetectChanges는 이와 관련하여 매우 조용합니다. 새 API를 사용해야하는 다른 이유도 있습니다. 어쨌든, 내 생각은 이것이야. http://msdn.microsoft.com/en-us/data/jj556205 http://msdn.microsoft.com/en-us/library/system.data.entity.infrastructure.dbchangetracker%28v = vs.103 % 29.aspx –

관련 문제