实体框架,问题成为主键

本文关键字:问题 框架 实体 | 更新日期: 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。

现在你的实际问题是:

当你在数据库中插入"源"时,一个新的密钥会被分配给它(除非另有规定),你可能会遇到很多麻烦,并试图使它成为你可以插入密钥的对象,或者,你可以执行以下操作之一:

  1. 跟踪来源:每当你创建一个源时,你首先要检查它是否不是以前创建的,如果它是使用那个实例的,如果不是,那么你就创建一个新的。你可以用字典或类似的东西来做这件事。如果你有一长串电子邮件,就这样做。

  2. 创建一个源列表,然后寻址。如果你没有很多电子邮件,这种方法会更容易。保留一个来源列表,对于每封电子邮件,将其添加到来源的电子邮件列表中(如果还没有来源,请创建一个来源)。最后添加所有来源。

希望它能帮助