2012-02-09 5 views
1

기존 데이터베이스와 스크립트를 사용하여 전자 메일을 보내고 원하는 데이터 (예 : 이름, 주소, 전자 메일 등)를 찾은 다음 데이터를 데이터베이스에 삽입합니다 필드/값 쌍 ("FieldLabel"의 열 & "FieldValue").WCF 서비스의 데이터 멤버를 반복합니다.

이제 C#과 Entity Framework를 사용하여이 이메일 구문 분석을 대체 할 API (WCF 서비스)를 구현하고 있습니다. "이름", "주소", "이메일"등의 DataMemebers가 포함 된 DataContract, "Details"를 API에 전달합니다. 그런 다음 각 데이터 멤버를 가져 와서 해당 이름을 FieldLabel로 사용하고 FieldValue로 값을 사용하는 InsertData() 메서드가 있습니다.

예를 들어, Name = "Brian"및 ZipCode = "11111"인 경우 Name/Brian & ZipCode/11111의 레이블/값 쌍을 만들고 싶습니다.

DetailsTable _detail = new DetailsTable();  // EF table object 

foreach (datamemeber in Details) 
{ 
    _detail.FieldLabel = datamemeber.toString(); 
    _detail.FieldValue = datamember.Value(); 
} 

UPDATE : 여기

내가 의사 코드에 후 나는 무엇을 내 세부 정보 DataContract

[DataContract] 
public class Details 
{ 

    public LeadDetail() 
    { 
     FirstName = ""; 
     LastName = ""; 
     StreetAddress = ""; 
     City = ""; 
     State = ""; 
     ZipCode = ""; 
    } 

    public LeadDetail(string firstName, string lastName, string streetAddress, 
     string city, string state, string zipCode) 
    { 
     FirstName = firstName; 
     LastName = lastName; 
     StreetAddress = streetAddress; 
     City = city; 
     State = state; 
     ZipCode = zipCode; 
    } 

    [DataMember] 
    public string FirstName; 
    [DataMember] 
    public string LastName; 
    [DataMember] 
    public string StreetAddress; 
    [DataMember] 
    public string City; 
    [DataMember] 
    public string State; 
    [DataMember] 
    public string ZipCode; 
} 

답변

1

가상 코드 작업을하기 위해 해결해야 할 몇 가지 문제가 있습니다. 먼저, 인스턴스화 된 Details 오브젝트의 필드를 반복하여 키/값 쌍을 검색하고, 다음으로 DetailsEntity에서 엔티티를 작성하여 삽입을 수행해야합니다. 세부 정보 (사용자 이름, zip, ...) 및 DetailsKeyValue (FieldLabel, FieldValue)의 이름을 올바르게 구분하면 클래스의 이해가 향상됩니다.

다음은 Details 개체의 필드를 반복하고 해당 EF 엔터티 인 DetailsKeyValue를 삽입하는 코드입니다.

using (var context = new DetailsKeyValueContext()) { 
    foreach (FieldInfo field in details.GetType().GetFields()) { 
     var detailsKeyValue = new DetailsKeyValue(); 
     detailsKeyValue.FieldLabel = field.Name; 
     detailsKeyValue.FieldValue = field.GetValue(details) as string; 
     context.DetailsKeyValue.Add(detailsKeyValue); 
    } 
    context.SaveChanges(); 
} 

다음은 코드의 첫 번째 엔티티 및 컨텍스트 클래스입니다.

public class Details 
{ 
    public string Name; 
    public string Zip; 
    public string Email; 
} 

public class DetailsKeyValue 
{ 
    public string FieldLabel { get; set; } 
    public string FieldValue { get; set; } 
} 

public class DetailsKeyValueContext: DbContext 
{ 
    public DbSet<DetailsKeyValue> DetailsKeyValue { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<DetailsKeyValue>() 
      .HasKey(x => x.FieldLabel); 
    } 
} 
0

당신의 '의사 코드'에 대한 코드를 추가는 거의 동일 보인다 이것을 달성하기위한 실제 코드. 필요한 것은 컨텍스트 (예 : DetailsContext)와 동일한 이름을 가진 연결 문자열이며 둘러 볼 준비가 된 DbContext입니다.

편집 :

Details details = Populate(); // Populated from parameter passed in 

using (var context = new DetailsContext()) 
{ 
    DetailsEntity _detail = new DetailsEntity();  // EF table object 

    foreach (datamemeber in details) 
    { 
     _detail.FieldLabel = datamemeber.Type; 
     _detail.FieldValue = datamember.Value; 
    } 

    context.SaveChanges(); 
} 

this is a good reference로 시작합니다.

+0

이 코드를 구현하면 "세부 정보는 '유형'이지만 '변수'처럼 사용됩니다." 내 원래 게시물에 세부 사항에 대한 DataContract를 추가했습니다. – BrianKE

+0

죄송합니다.'foreach'는'foreach (datamember in details)'가되어서 반복되는 내용이 컬렉션의 실제 인스턴스가 아니라 콜렉션의 타입이됩니다. –