2012-02-09 29 views
1

我們有一個現有的數據庫和一個腳本,它會接收一封電子郵件,找到我們想要的數據片段(即名稱,地址,電子郵件等),然後將數據插入數據庫作爲字段/值對(「FieldLabel」的列)「FieldValue」的&)。在WCF服務中迭代數據成員

我現在正在實現一個API(WCF服務)來取代使用C#與Entity Framework的電子郵件解析。我正在創建一個DataContract,「Details」,它包含傳遞給API的「Name」,「Address」,「Email」等DataMemebers。然後我有一個InsertData()方法,我想用它來獲取每個數據成員並將其名稱用作FieldLabel,並將其值作爲FieldValue。例如,在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(); 
} 

更新:加入了代碼爲我詳細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中創建一個實體以執行插入。如果我正確理解您的問題,區分Details(用戶名,zip,...)和DetailsKeyValue(FieldLabel,FieldValue)類的名稱將提高您的代碼的可讀性。

這裏是遍歷整個詳細對象的字段和插入等效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

你的「僞代碼」看起來幾乎相同真正的代碼來實現這一點。您所需要的只是一個包含它的DbContext,一個與您的上下文具有相同名稱的連接字符串(例如,DetailsContext),並且您準備好了。

編輯:

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

當我實現這個代碼時,它抱怨「Details is a'type'',但像'variable'一樣使用。我已將DataContract for Details添加到我的原始帖子中。 – BrianKE 2012-02-09 14:21:21

+0

對不起,'foreach'應該是'foreach(詳細datamember)',以便您正在迭代的細節是集合的實際實例,而不是集合的類型。 – 2012-02-09 16:27:11