2010-02-15 1 views
6

저는 VS 2010 RC를 사용하여 Entity Framework 4에서 제작 한 국가의 간단한 엔티티를 보유하고 있습니다. 아래의 POCO와 비슷합니다.Entity Framework 4 - ApplyCurrentValues를 사용하여 부울 속성을 항상 업데이트하는 것은 아닙니다

public class Company 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string ISOCode { get; set; } 
    public boolean Active { get; set; } 
} 

내 저장소 코드는 아래에 있습니다. 'db'는 생성자에서 초기화되는 내 컨텍스트입니다.

public void EditCountry(Country countryToEdit) 
{ 
    db.Countries.Attach(new Country { ID = countryToEdit.ID }); 
    db.Countries.ApplyCurrentValues(countryToEdit); 
    db.SaveChanges(); 
} 

countryToEdit에 false에서 true로 활성 필드 변경이 예상되는

update [dbo].[Countries] 
set [Name] = @0, [ISOCode] = @1, [Active] = @2 
where ([ID] = @3) 
@0 nvarchar(256),@1 nvarchar(12),@2 bit,@3 int,@0='Algeria',@1='DZ',@2=1,@3=4 

다음과 같은 SQL을 생성합니다. 내가 countryToEdit에 true에서 false로 활성 필드를 변경하는 경우

는 다음과 같은 SQL는 Active 필드를 업데이트하려고 시도가 없습니다

update [dbo].[Countries] 
set [Name] = @0, [ISOCode] = @1 
where ([ID] = @2) 
@0 nvarchar(256),@1 nvarchar(12),@2 int,@0='Afghanistann',@1='AF',@2=1 

를 생성한다.

답변

7

ApplyCurrentValues in EF 4 질문에 대한 답변입니다. 당신은 부울 필드가 false로 초기화되어 빈 스텁 객체를 연결하는 경우

db.Countries.Attach(db.Countries.Single(c => c.ID == countryToEdit.ID)); 

을해야합니다. ApplyCurrentValues ​​호출은 스텁과 편집 된 객체 사이의 부울 값에 변화가 없음을 확인합니다.

위의 코드는 다른 DB 쿼리를 추가하지만 나는 그와 함께 살 수 있습니다.

+1

속성을 nullable bool로 변경할 수있는 경우 스텁 엔터티 접근 방식을 사용할 수 있습니다. 기본값은 null이 될 것이고 ApplyCurrentValues는 현재 엔티티에서 스텁의 null에서 false로 변경 사항을 선택하고 업데이트를 위해 여분의 sql을 방출합니다. –

0

데이터베이스를 두 번 이동 (선택 및 업데이트)하지 않으려면 부울 값을 두 번 수정할 수 있습니다.

예 :

public void EditCountry(Country countryToEdit) 
{ 
    db.Countries.Attach(new Country 
    { 
     ID = countryToEdit.ID, 
     Active = !countryToEdit.Active 
    }); 
    db.Countries.ApplyCurrentValues(countryToEdit); 
    db.SaveChanges(); 
} 

이 필드가 업데이트되었습니다 플래그 엔티티 프레임 워크를 의지 업데이트됩니다 무엇의 반대에 부울의 기본 값을 설정.

나는 이것이 최선의 코드가 아니라는 것을 알고있다. 다른 개발자에게 혼동을 줄 수도 있지만 데이터베이스를 두 번 치지 않아도되므로 성능이 가장 좋아질 수 있습니다.

관련 문제