2012-08-09 4 views
0

Azure 테이블 저장소를 사용하고 있으며 엔티티의 null 및 기본값이 작동하는 방법에 대해 질문이 있습니다.Azure 테이블 저장소의 속성에 대한 기본값

특히, 나는 TableServiceEntity을 확장하는 클래스가 있습니다. 이 클래스의 기본 생성자과 같이 다양한 속성에 대한 기본값을 설정하는 것입니다 :

public class MyEntity: TableServiceEntry 
{ 
    public MyEntity() : MyEntity("invalid", "invalid") {} 
    public MyEntity(string f1, string f2) 
    { 
     Field1 = f1; 
     Field2 = f2; 
    } 

    public string Field1 { get; set; } 
    public string Field2 { get; set; } 
} 

내가 로컬이 클래스를 테스트 (에뮬레이터) 다음과 같은 엔티티 구성하여 :

MyEntity e = new MyEntity("hello", null); 

을 나는 개체를 업로드 로컬로 검색하고 예상대로 두 필드가 각각 "hello"및 null로 설정되었습니다.

그러나 Azure 클라우드에 동일한 엔티티를 업로드하면 두 속성에 대해 각각 "hello"및 "invalid"가 반환되었습니다. 엔티티를 저장

내 코드는 다음과 같습니다 :

public class MyTable : TableServiceContext 
{ 
    ... 
    public void AddEntry(MyEntity e) 
    { 
     this.AddObject("MyTable", e); 
     this.SaveChangesWithRetries(SaveChangesOptions.ReplaceOnUpdate); 
    } 
} 

나는 기본 생성자는 인수를 취하지함으로써이 문제를 해결할 수 있었다,하지만 난 어떻게 테이블에 저장 작품의 근본적인 오해를 가지고있는 것처럼 지금은 기분이 . TableServiceEntry의 속성에 대한 기본값을 지정하면 해당 값이 클라우드의 테이블에있는 각 행의 기본값이되지만 에뮬레이터에는 없습니다 (즉, 클라우드 vs. SQL Express)는 사실입니까? 그렇다면 왜 클라우드에서 null으로 기본값을 덮어 쓸 수 없습니까? Azure 테이블 스토리지에서 기본 생성자와 null이 어떻게 작동하는지 설명하는 문서가 있습니까?

답변

1

예, 에뮬레이터와 클라우드에서 테이블 저장소가 작동하는 방식에는 차이가 있습니다. SQL 서버에 구현 된 에뮬레이터는 행 값에 관계없이 행에 대해 정의되지 않은 경우에도 테이블에 정의 된 모든 열을 반환합니다 (null/non-null). 클라우드에서 null로 설정된 속성은 REST 호출에 저장되거나 반환되지 않습니다.

빠른 해결 방법은 속성 집합에서 null을 확인하고 전달 된 값이 null이 아닌 경우에만 속성을 변경하는 것입니다.

+0

그냥 다른 방법을 설명하기 위해 일어나는 일은 null이 저장되지 않는다는 것입니다. 검색시 클래스는 값이 "invalid"로 초기화되고 저장소 라이브러리는 저장소에서 반환 된 값으로 필드를 덮어 씁니다. Field2에는 값이 없으므로 (null도 아님) Field2는 건드리지 않고 여전히 "invalid"를 포함합니다. – smarx

+0

내가 관찰 한 동작은 정확하게 @smarx와 @Lucifure가 기술하는 방식입니다. 두 가지 주요 테이크 어웨이가 있습니다. (1)'null'은 저장/반환되지 않습니다. (2) 엔티티를 Azure 테이블에서 가져올 때 컨트롤의 흐름은 기본 생성자가 호출 된 다음 테이블의 모든 (기존) 값이 채워진다는 것입니다. 고마워요! – msplants

0

Devstorage와 실제 저장소는 어떤 경우에는 다르게 동작하지만, NULL 값을 다르게 처리하는 것을 본 적이 없습니다. 그리고 확실히 NULL에서 "무효"값을 변경하는 것을 본 적이 없습니다. 우연히 잘못된 값을 클라우드에 업로드하지 않았습니까? 다시 시도하고 Fiddler를 사용하여 실제 요청 및 응답 값을 볼 수 있습니다.

관련 문제