实体框架,制作主键的问题

时间:2016-01-12 03:57:45

标签: c# sql entity-framework

我运行了一个电子邮件刮刀,并将所有电子邮件放入一个文件中,该文件将被放入我的课程数据库中(它们不会被用于任何事情,只是为了分配),我只是在将它们正确地放入数据库时​​遇到一些麻烦。现在我有一个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个电子邮件。我试图将域名作为主键,因此域名远远少于电子邮件。

1 个答案:

答案 0 :(得分:0)

首先,你的代码并没有多大意义,但我会把它归结为你。

这不会起作用,因为它会出列2个项目:

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

除非您的电子邮件队列中有电子邮件地址,网址(无论这意味着什么)和域名(电子邮件地址的一部分?)所有这些都不是问题,更像是设计缺陷,或者可能是您从中获取数据的地方, IDK的。

现在你的实际问题是:

当您在数据库中插入“Source”时,会为其分配一个新密钥(除非另有说明),您可能会遇到很多麻烦并尝试制作它以便您可以插入密钥OR,您可以执行一个以下内容:

  1. 跟踪来源: 无论何时创建源,您首先检查它是否先前是否已创建,如果它是否使用该实例,如果不是,则创建一个新源。 您可以使用词典或类似的东西来执行此操作。如果您有很长的电子邮件列表,请执行此操作。

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

  3. 希望有所帮助