2016-01-12 133 views
0

我運行了一個電子郵件刮板並將所有的電子郵件放到一個文件中,該文件將被放入我的類的數據庫中(它們將不會用於任何事情,只是爲了分配) ,我只是有點麻煩,把他們正確地放入數據庫。現在我有一個包含1000封電子郵件的文件,它們的URL和域名(我將它放到一個文件中,因爲收集所有電子郵件需要很長時間,而且我讓它運行了幾個晚上)。實體框架,主鍵問題

的文件列表,電子郵件,網址,域名,電子郵件,網址等..所以我讀整個文件到隊列中,然後將它們插入到數據庫這樣的:

public class Source 
{ 
    [Key] 
    public int SourceId { get; set; } 

    [StringLength(500)] 
    public string Domain { get; set; } 

    // Nav Prop 
    public virtual List<Email> Emails { get; set; } 
} 

public class Email // POCO 
{ 
    public string Url { get; set; } 
    public int EmailId { get; set; } 
    public string EmailAddress { get; set; } 
    public DateTime CreationTime { get; set; } 

    // Nav Prop 
    public virtual Source Source { get; set; } 
} 

using (var db = new ScraperContext()) 
{ 
    while (emailArrayQueue.Count > 0) 
    { 
     db.Emails.Add(new Email() 
       { 
        EmailAddress = (string)emailArrayQueue.Dequeue(), 
        Url = (string)emailArrayQueue.Dequeue(), 
        CreationTime = DateTime.UtcNow, 
        Source = new Source() 
        { 
         SourceId = emailArrayQueue.Peek().GetHashCode(),//line that doesn't work 
         Domain = (string)emailArrayQueue.Dequeue() 
        } 
       }); 

     db.SaveChanges(); 
    } 
} 

由於我想這是怎麼工作的本質,我認爲這將是最好的方式讓他們進入數據庫,但突出顯示的行似乎不工作,因爲每個源ID似乎只是默認它的數字被創建。這意味着數據庫中既有1000個來源,又有1000個電子郵件。我試圖讓域名成爲主鍵,因此域名比電子郵件少得多。

回答

0

首先,你的代碼並沒有太大的意義,但是我會把它壓制到你的身上。

這是行不通的,因爲它會轉移2項:

EmailAddress = (string)emailArrayQueue.Dequeue(), 
Url = (string)emailArrayQueue.Dequeue() 

除非你的郵件隊列中有emailAddresses,網址(無論這意味着)和域(電子郵件地址的一部分?)所有的合併是不是問題,更像是一個設計缺陷,或者也許這就是你從中獲取數據的地方,idk。

現在您的實際問題:

當您插入數據庫中的一個新的密鑰分配給它(除非另有說明),「源」,你可以通過很多麻煩,並儘量做到如此你可以插入鑰匙或者,您可以執行下列操作之一:

  1. 跟蹤來源: 只要你創建你第一次檢查,如果它不是先前創建的來源,如果是使用實例,如果不是那麼你創建一個新的。 你可以使用一個字典或類似的東西來做到這一點。如果您有一長串電子郵件,請執行此操作。

  2. 創建一個源代碼列表,然後添加範圍。 如果你沒有太多電子郵件,這種方法更容易。 保留來源列表,對於每封電子郵件,將其添加到來源的電子郵件列表(如果還沒有電子郵件,則創建一個來源)。 最後AddRange所有來源。

希望它有幫助