2012-03-01 7 views
2

나는 다음과 같은 데이터 구조를 가지고 :TableServiceContext는 ValueObjects를 직렬화하지 않습니다

[DataServiceEntity] 
public class User 
{ 
    public string RowKey { get; set; } 
    public string PartitionKey { get; set; } 
    public DateTime Timestamp { get; set; } 

    public AddressValueObject Address { get; set; } 
} 

[DataServiceEntity] 
public class AddressValueObject 
{ 
    public string City { get; set; } 
    public string Street { get; set; } 
} 

가 지금은 사용자 클래스의 새 인스턴스를 생성하고 다음과 같은 방법을 사용하여 윈도우 Azure 테이블 스토리지 에뮬레이터로 지속하려고 해요을 :

void CreateAndSaveNewUser() 
{ 
    var userInstance = new User 
    { 
     RowKey = "SomeRowKey", 
     PartitionKey = "SomePartitionKey", 
     Address = new AddressValueObject 
     { 
      City = "SomeCity", 
      Street = "SomeStreet" 
     } 
    }; 

    var tableServiceContext = CloudStorageAccount 
           .DevelopmentStorageAccount 
           .CreateCloudTableClient() 
           .GetDataServiceContext(); 

    tableServiceContext.AddObject("UserTable", userInstance); 

    tableServiceContext.SaveChanges(); 
} 

이제 AddressValueObject가 올바르게 serialize되지 않는 문제가 있습니다. 저장소에는 AddressValueObject라는 emtpy라는 열 하나만 있습니다.

AddressValueObject_City 및 AddressValueObject_Street에 대한 열을 만들지 않습니다.

내가 뭘 잘못하고 있니? 어떤 속성이 누락 되었습니까?

Azure 테이블 저장소는 참조 된 ValueObjects도 지원합니까 ??

감사합니다.

답변

3

단순히 그렇게 할 수는 없습니다. 테이블 저장소는 일반 단순 테이블이며 복잡한 유형을 지원하지 않습니다. 따라서 관계 또는 제약 조건은 지원되지 않습니다. 임시 테이블을 사용하면 다른 테이블에 저장된 관련 개체의 파티션 키와 행 키를 저장할 수 있습니다. 관계를 사용하려면 SQL Azure를 선택하는 것이 가장 좋습니다.

2

Fabio Cozzolino가 정확합니다. Microsoft Azure 테이블 저장소 클라이언트는 직렬화를 지원하지 않습니다. 그러나 수동으로 객체를 직렬화하여 XML 문자열 또는 바이트 []로 저장할 수 있습니다.

본인은 직렬화를 지원하는 클라이언트를 작성했습니다. 또한 배열, 열거 형 및 64K보다 큰 데이터와 같은 많은 다른 기능이 포함되어 있습니다. www.lucifure.com에서 확인하거나 NuGet을 통해 Lucifure Stash를 다운로드 할 수 있습니다.

0

필자는 Azure 테이블 저장소에 /에서 복잡한 개체를 쓰고 읽을 수있는 ObjectFlattenerRecomposer API를 Nuget에 작성했습니다.

Nuget 패키지 : https://www.nuget.org/packages/ObjectFlattenerRecomposer/

블로그 : https://doguarslan.wordpress.com/2016/02/03/writing-complex-objects-to-azure-table-storage/

API가 평평 속성 사전에서 원래 복잡한 객체를 구도하는 EntityProperty 사전과 기능으로 복잡한 객체를 평평하게하는 기능을 제공합니다. 한 가지 용도는 API가 Azure Storage Client SDK를 사용하여 일반적으로 불가능한 병합 된 형식의 Azure 테이블 저장소에 중첩 된 속성이있는 복잡한 개체를 작성할 수 있다는 것입니다.

API를 사용하면 Enum, TimeSpan, DateTimeOffset, Nullable 속성 유형을 Azure Storage Client SDK를 통해 가능하지 않은 Azure 테이블 저장소에 저장할 수 있습니다.

사용법 :

ObjectFlattenerRecomposer;

// 객체를 평평하게하고 EntityProperty 사전

사전 flattenedProperties = EntityPropertyConverter로 변환.Flatten (complexObject);

// DynamicTableEntity을 만들고 해당 PK와 RK

DynamicTableEntity dynamicTableEntity = 새로운 DynamicTableEntity (에 PartitionKey, rowKey)을 설정;

dynamicTableEntity.Properties = flattenedProperties;

// 클라이언트 SDK를 사용하여 푸른 표 저장소에 DynamicTableEntity 쓰기

// DynamicTableEntity 같이 PK를 사용하여 푸른에서 같은 PK와 RK

DynamicTableEntity 엔티티 = [읽기를 사용하여 다시 AzureTableStorage에서 엔티티 읽기 및 RK];

// DynamicTableEntity를 원본 복합 객체로 다시 변환합니다.

원래 complexObject가 Order 유형이라고 상상해보십시오.

주문 순서 = EntityPropertyConverter.ConvertBack (entity.Properties);

관련 문제