将大量数据插入MySQL数据库

时间:2017-05-31 21:01:38

标签: c# mysql .net entity-framework entity

我想知道在不发送太多查询的情况下,将复杂的数据集添加到数据库的最有效方法是什么。让'说我有这些模型:

public class Book
{
    [Key]
    public int Id { get; set; }
    [MaxLength(255)]
    public string Title { get; set; }
    [MaxLength(255)]
    public string Description { get; set; }

    public virtual Author Author { get; set; }
    public virtual List<Genre> Genres { get; set; }
}

public class Author
{
    [Key]
    public int Id { get; set; }
    [MaxLength(255), Index(IsUnique = true)]
    public string Name { get; set; }

    public virtual Book Book { get; set; }

    public Author(string n)
    {
        Name = n;
    }
}

public class Genre
{
    [Key]
    public int Id { get; set; }
    [MaxLength(32), Index(IsUnique = true)]
    public string Name { get; set; }

    public Book Book { get; set; }

    public Genre(string g)
    {
        Name = g;
    }
}

为简单起见,我创建了这些快速类。现在,让我们说我想在500个批次中加入这些集合。这样做最好和最简单的方法是什么?我应该如何链接现有的AuthorGenre以及是否与给定的Name, simply create a new one alongside the main Book`实体相关联?

我想避免多次查询,例如Genres.FirstOrDefault(o => o.Name == n);,并且因为数据量很大,每个批次在本地下载整个表格似乎不实用。

当然,我可以采取以下措施:

var genres = ac.Genres.ToList();
var authors = ac.Authors.ToList();
foreach(var b in batch) // Some weird input model type or something along these lines
{
    var book = new Book(b.Name, b.Desc);
    foreach(string genre in b.Genres)
        if(genres.FirstOrDefault(o => o.Name == genre) == null)
        {
            var newGenre = new Genre(genre);
            book.Genres.Add(newGenre);
            genres.Add(newGenre); // I'm not only adding it to the database, but also to the local collection for reference for other books
        }
    if(authors.FirstOrDefault(o => o.Name == b.AuthorName) == null)
    {
        var newAuthor = new Author(b.AuthorName);
        book.Author = newAuthor;
        authors.Add(newAuthor); // Same as above
    }
    ac.Books.Add(book);
}
ac.Save();

对不起,如果有任何语法错误,我在帖子的TextArea中输入了所有内容; D

无论如何,虽然这是一种有效的方法并且确实有效,但我不知道是否有任何更简单或更快捷的方法可以做到这一点。某种INSERT IGNOREINSERT IF NOT EXISTS会很棒。

截至目前,EF是否可以实现这样的目标?

谢谢!

0 个答案:

没有答案