我运行了一个电子邮件刮刀,并将所有电子邮件放入一个文件中,该文件将被放入我的课程数据库中(它们不会被用于任何事情,只是为了分配),我只是在将它们正确地放入数据库时遇到一些麻烦。现在我有一个1000封电子邮件的文件,他们的URL和域名(我把它放到一个文件中,因为收集所有电子邮件花了很长时间,我让它运行了几个晚上)
该文件列为电子邮件,网址,域名,电子邮件,网址等...所以我将整个文件读入队列,然后将它们插入到DB中,如下所示:
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一样工作似乎只是默认为创建它的数字。这意味着DB中有1000个源和1000个电子邮件。我试图将域名作为主键,因此域名远远少于电子邮件。
答案 0 :(得分:0)
首先,你的代码并没有多大意义,但我会把它归结为你。
这不会起作用,因为它会出列2个项目:
EmailAddress = (string)emailArrayQueue.Dequeue(),
Url = (string)emailArrayQueue.Dequeue()
除非您的电子邮件队列中有电子邮件地址,网址(无论这意味着什么)和域名(电子邮件地址的一部分?)所有这些都不是问题,更像是设计缺陷,或者可能是您从中获取数据的地方, IDK的。
现在你的实际问题是:
当您在数据库中插入“Source”时,会为其分配一个新密钥(除非另有说明),您可能会遇到很多麻烦并尝试制作它以便您可以插入密钥OR,您可以执行一个以下内容:
跟踪来源: 无论何时创建源,您首先检查它是否先前是否已创建,如果它是否使用该实例,如果不是,则创建一个新源。 您可以使用词典或类似的东西来执行此操作。如果您有很长的电子邮件列表,请执行此操作。
创建一个源列表,然后添加。 如果您没有很多电子邮件,这种方法会更容易。 保留一个源列表,每封电子邮件都将其添加到源的电子邮件列表中(如果还没有源,则创建一个源)。 最后,AddRange所有来源。
希望有所帮助