我想知道在不发送太多查询的情况下,将复杂的数据集添加到数据库的最有效方法是什么。让'说我有这些模型:
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个批次中加入这些集合。这样做最好和最简单的方法是什么?我应该如何链接现有的Author
和Genre
以及是否与给定的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 IGNORE
或INSERT IF NOT EXISTS
会很棒。
截至目前,EF是否可以实现这样的目标?
谢谢!