#c# #asp.net-core #.net-core #entity-framework-core #ef-core-3.1
#c# #asp.net-core #.net-core #entity-framework-core #ef-core-3.1
Вопрос:
Рассмотрим следующую модель данных EF core 3.1:
public class Blog
{
public int Id { get; set; }
public string Name { get; set; }
public List<Post> Posts { get; set; }
}
public class Post
{
public int Id { get; set; }
public string Author { get; set; }
public DateTime Date { get; set; }
public Blog Blog { get; set; }
public int BlogId { get; set; }
}
public class BlogAppContext: DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("Data Source=.;Initial Catalog=DB_BLOG_APP;Integrated Security=SSPI;MultipleActiveResultSets=True");
}
public DbSet<Post> Posts { get; set; }
public DbSet<Blog> Blogs { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Blog>()
.HasMany(x => x.Posts)
.WithOne(x => x.Blog)
.HasForeignKey(x => x.BlogId)
.IsRequired();
}
}
Рассмотрим сценарий, в котором я выполняю следующий запрос, используя быструю загрузку:
static void Main(string[] args)
{
using var context = new BlogAppContext();
var blogs = context.Blogs.Include(x => x.Posts).ToList();
foreach (var blog in blogs)
{
Console.WriteLine($"There are {blog.Posts.Count} posts");
}
}
Рассмотрев некоторые примеры, я заметил, что инициализация свойств навигации по списку является обычной практикой. В моем случае это привело бы к чему-то вроде этого:
public class Blog
{
public int Id { get; set; }
public string Name { get; set; }
public List<Post> Posts { get; set; } = new List<Post<();
}
Я спрашиваю, действительно ли это полезно при запросе с помощью быстрой загрузки.
Я провел несколько тестов и убедился, что приведенный выше запрос автоматически создает пустой список для блога, в котором нет записей.
Другими словами, кажется, что даже если свойство Posts
навигации не инициализировано для пустого списка внутри определения Blog
сущности, запрос, использующий нетерпеливую загрузку, не заботится и не возвращает null
значение для свойства Posts
навигации.
Правильно ли я понимаю ?
Если это так, какова полезность (если таковая имеется) инициализации свойства Posts
навигации для пустого списка при запросе базы данных с помощью быстрой загрузки для загрузки связанных объектов?
Комментарии:
1. Вы пробовали сохранять
Blog
сPosts
помощью beingnull
?
Ответ №1:
Это бесполезно, и вам не нужно этого делать, потому что вы используете быструю загрузку (что не очень эффективно, если вы загружаете много ненужных данных, но это уже другая тема).
Однако это полезно в двух случаях:
- Если вы не используете быструю загрузку, поскольку
Posts
свойство может бытьnull
- Вы создаете новый
Blog
объект, который еще не сохранен в базе данных, и хотите добавитьPost
в него новый. В этом случаеPosts
свойство должно быть инициализировано передPosts.Add(post)
вызовом, потому что будет выдано неинициализированное исключение null ref.
Комментарии:
1. полностью имеет смысл.