2010-05-28 1 views
6

sprocs를 사용하여 내 엔터티에 대한 모든 CUD 작업을 매핑하는 EF 4를 사용하고 있습니다.Entity Framework 4 EntityState가 변경되지 않은 발사 업데이트

두 개의 테이블 ADDRESS 및 PERSON이 있습니다. PERSON은 여러 개의 ADDRESS를 가질 수 있습니다. 여기

내가 실행하고 코드입니다 :

Person person = (from p in context.People 
          where p.PersonUID == 1 
          select p).FirstOrDefault(); 

Address address = (from a in context.Addresses 
           where a.AddressUID == 51 
           select a).FirstOrDefault(); 

address.AddressLn2 = "Test"; 

context.SaveChanges(); 

내가 retrieveing하고있는 사람과 관련된 업데이트중인 주소 - 그들은 명시 적으로 코드에서 어떤 식 으로든 연결되지 않더라도. context.SaveChanges()가 실행되면 내 Address 엔티티에 대한 Update sproc가 실행되는 것뿐만 아니라 (예상했던 것처럼) 실행되지만 Person 엔티티의 Update sproc도 마찬가지입니다. 개인 개체.

context.SaveChanges() 호출 전에 두 개체의 EntityState를 확인하면 내 주소 엔터티에 "Modified"라는 EntityState가 있고 Person 인 엔터티에 "Unchanged"라는 EntityState가 있다는 것을 알 수 있습니다.

Person 엔티티에 대해 Update sproc이 호출되는 이유는 무엇입니까? 이 일이 발생하지 않도록 설정할 수있는 일종의 설정이 있습니까?


나는 문제가 있기 때문에 내 현재 프로젝트 환경에서 뭔가 일이되지 않았습니다 확인하는 두 번째 프로젝트를 만들었습니다.

먼저 Order 및 OrderDetail 테이블이 포함 된 새 데이터베이스를 만들었습니다. Order 간에는 둘 이상의 OrderDetail이있을 수 있도록이 둘 사이에는 외부 키가 있습니다. 또한 레코드가 업데이트 될 때 DateTime 필드를 업데이트하는 Order 및 OrderDetail 테이블에서 "after update"DB 트리거를 만들었습니다.

둘째, 간단한 WPF 응용 프로그램을 만들고 내 데이터베이스에서 생성 된 ADO.NET 엔터티 모델을 만들었습니다.

public partial class MainWindow : Window 
    { 
    public MainWindow() 
    { 
     InitializeComponent(); 

     MyEntities context = new MyEntities(); 

     Order order = (from o in context.Orders 
       select o).FirstOrDefault(); 

     OrderDetail orderDetail = (from d in order.OrderDetails 
        select d).FirstOrDefault(); 

     orderDetail.Qty = 7; 

     context.SaveChanges(); 
    } 
    } 

내가 내 주문 및 OrderDetail 개체에 대한 모든 기능 매핑을 수행하지 않고 프로그램을 실행 다음과 같이

셋째, 내 클래스 생성자에 코드를 추가했다. 결과는 정확히 내가 기대했던 것이고 OrderDetail 레코드는 Qty가 7로 업데이트되고 UpdateDateTime 필드는 업데이트가 발생한 날짜와 시간으로 채워집니다. 내 주문 기록에 변경 사항이 없으므로 업데이트가 발생하지 않았습니다.

그런 다음 DB의 Order 및 OrderDetail 테이블 업데이트를 처리하기 위해 저장 프로 시저를 만듭니다. 그것들은 특별한 일을하지 않고 그냥 테이블의 모든 열에 대한 매개 변수를 받아 들인 다음 각 필드를 관련 매개 변수와 동일하게 설정합니다. 그런 다음 매핑 세부 정보 (함수에 맵핑) 창을 사용하여 이러한 저장 프로 시저를 모델 객체에 매핑했습니다.

매핑을 수행 한 후에 프로그램을 실행했습니다. 결과적으로 OrderDetail 테이블에 대한 업데이트의 예상되는 동작을 관찰했지만 "업데이트 후"트리거 테이블의 Order 테이블이 실행되었고 UdateDateTime 필드가 업데이트가 발생한 날짜와 시간으로 설정되었습니다. 예상하지 못한 것입니다.

모든 삽입, 업데이트 및 삭제 작업에 대해 저장 프로 시저를 활용하고 관련 엔터티까지 업데이트가 연결되지 않는 방법을 알고있는 사람이 있습니까?

+0

그냥 확인하기 위해, 당신의 오류와 관련된 다른 코드가 없다? – Nix

+0

오류가 표시되지 않습니다. 나는 기대 한 행동을 보지 않을 뿐이며 예상되는 행동을보기 위해 내가 왜해야하고 무엇을해야하는지 궁금하다. 주소 엔티티 만 DB에서 업데이트된다. 유일한 다른 코드는 EF 생성 된 엔티티 컨텍스트의 새 인스턴스를 만드는 내 컨텍스트 개체의 인스턴스입니다. – Filosopher

+0

업데이트 : 원래 게시물에서 말했듯이 저장 프로 시저를 사용하여 모든 테이블에서 Create, Update 및 Deletes를 처리합니다. 필자는 모델에서 이러한 매핑을 제거하고 Person 테이블의 DB 트리거를 사용하여 코드를 다시 실행했으며 NO UPDATE가 발생했습니다. 이 경우 업데이트가 발생하게 만드는 것은 Create, Update 및 Delete에 대한 sproc 매핑과 같습니다. 불행히도 우리는 이러한 작업을 위해 sprocs를 사용해야하므로 해결이 여전히 필요합니다. 나는 방금 더 많은 정보로 게시를 업데이트 할 것이라고 생각했습니다. – Filosopher

답변

4

동일한 문제가 있으며 that MS KBD page에 언급 된 핫픽스로 해결되었습니다.

수정

는 .NET 4.5에 널리 출판되었다. 그러나 .NET 4와 함께 제공되는 System.Data.Entity.dll 버전을 자체 버전으로 대체하기 때문에 .NET 4/.NET 4.5에서 작동하는 EF 6도 이러한 수정을 제공 할 것으로 예상됩니다.