实体框架,问题成为主键
本文关键字:问题 框架 实体 | 更新日期: 2023-09-27 18:30:03
我运行了一个电子邮件抓取器,并将所有电子邮件放入一个文件中,该文件将被放入我的类的数据库中(它们不会被用于任何事情,只是为了分配),我只是在将它们正确放入数据库时遇到了一些问题。现在我有一个包含1000封电子邮件、它们的URL和域名的文件(我把它放在一个文件中,因为收集所有电子邮件花了很长时间,我让它运行了几个晚上)。
文件列表为电子邮件、url、域、电子邮件、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似乎都默认为创建它的编号。这意味着数据库中同时有1000个来源和1000封电子邮件。我正在努力使域名成为主键,所以域名比电子邮件少得多。
首先,您的代码并没有多大意义,但我会让您放心。
这将不起作用,因为它退出了2个项目的队列:
EmailAddress = (string)emailArrayQueue.Dequeue(),
Url = (string)emailArrayQueue.Dequeue()
除非你的电子邮件队列有emailAddresses、url(不管这意味着什么)和domain(电子邮件地址的一部分?),所有这些都结合在一起,这不是问题,更像是一个设计缺陷,或者这可能是你获取数据的地方,idk。
现在你的实际问题是:
当你在数据库中插入"源"时,一个新的密钥会被分配给它(除非另有规定),你可能会遇到很多麻烦,并试图使它成为你可以插入密钥的对象,或者,你可以执行以下操作之一:
跟踪来源:每当你创建一个源时,你首先要检查它是否不是以前创建的,如果它是使用那个实例的,如果不是,那么你就创建一个新的。你可以用字典或类似的东西来做这件事。如果你有一长串电子邮件,就这样做。
创建一个源列表,然后寻址。如果你没有很多电子邮件,这种方法会更容易。保留一个来源列表,对于每封电子邮件,将其添加到来源的电子邮件列表中(如果还没有来源,请创建一个来源)。最后添加所有来源。
希望它能帮助