powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / ASP.NET EF ICollection NULL
6 сообщений из 6, страница 1 из 1
ASP.NET EF ICollection NULL
    #38613448
ДобрыйКот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.

Решил поэксперементировать с EntityFramework Code First и ASP.NET. Делал все по аналогии с видео с сайта asp.net раздел Learning \ MVC.
Собственно проблема вот в чем:
AppStorage.Instance.MainForumPartitions.ToList() - нормально возвращает все объекты [MainForumPartition], НО у этих объектов есть ICollection<ForumPartition> ForumPartitions - и это свойство всегда NULL, и почему не пойму хоть застрелите. Google тыркал как мог но найти не смог почему такое. При условии что в видео с asp.net сайта коллекция возвращается нормальная

1. БД - "New Item" в VS - и там "SQL Server Database".
2. Класс контекст определён ниже:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 public class AppStorage : DbContext
    {
private static AppStorage _instance = null;
        public static AppStorage Instance
        {
            get
            {
                if(_instance == null)
                {
                    _instance = new AppStorage();
                }
                return _instance;
            }
        }
        public AppStorage() 
            : base(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\ForumDatabaseFile.mdf;Integrated Security=True")
        { }

        public DbSet<MainForumPartition> MainForumPartitions { get; set; }
        public DbSet<ForumPartition> ForumPartitions { get; set; }
..
}



3. У него DbSet MainForumPartition определён
Код: c#
1.
2.
3.
4.
5.
6.
public class MainForumPartition : EntityBase
    {
        [Required]
        public string PartitionName { get; set; }
        public ICollection<ForumPartition> ForumPartitions { get; set; }
    }



4. ForumPartition :
Код: c#
1.
2.
3.
4.
5.
6.
7.
public class ForumPartition : EntityBase
    {
        [Required]
        public string PartitionName { get; set; }
        public string PartitionDescription { get; set; }
        public ICollection<Topic> Topics { get; set; }
    }


5. Конфигурация миграции
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
internal sealed class Configuration : DbMigrationsConfiguration<SimpleForum.Database.AppStorage>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
        }

        protected override void Seed(SimpleForum.Database.AppStorage context)
        {
            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //
            var p = new MainForumPartition() { PartitionName = "DICK" };
            p.ForumPartitions = new List<ForumPartition>();

            var f = new ForumPartition() { PartitionName = "SUB-DICK" };
            p.ForumPartitions.Add(f);

            context.ForumPartitions.AddOrUpdate(a=> a.PartitionName, f);
            context.MainForumPartitions.AddOrUpdate(a => a.PartitionName, p);
            context.SaveChanges();
                
        }
    }



6. SELECT из файла БД, показывающий что данные есть и верные:
ForumPartitions:
Код: sql
1.
2.
            Id	PartitionName	PartitionDescription	DeactivationDate	CreationDate	MainForumPartition_Id
9572DB63-F64C-496A-8234-2C6F2B31CF44	SUB-DICK	NULL	NULL	NULL	01E014F4-D2D6-415C-BA16-A49FFDF228B7



MainForumPartitions:
Код: sql
1.
2.
Id	PartitionName	DeactivationDate	CreationDate
01E014F4-D2D6-415C-BA16-A49FFDF228B7	DICK	NULL	NULL



Спасибо
...
Рейтинг: 0 / 0
ASP.NET EF ICollection NULL
    #38613545
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДобрыйКотНО у этих объектов есть ICollection<ForumPartition> ForumPartitions - и это свойство всегда NULL, и почему не пойму хоть застрелите.

необходимо указать для коллекций модификатор virtual . если не указывать этот модификатор, тогда надо вручную указывать какие зависимости подгружать, например, с помощью функции Include().

короче, надо так:

Код: c#
1.
2.
3.
4.
5.
6.
    public class MainForumPartition : EntityBase
    {
        [Required]
        public string PartitionName { get; set; }
        public virtual ICollection<ForumPartition> ForumPartitions { get; set; }
    }
...
Рейтинг: 0 / 0
ASP.NET EF ICollection NULL
    #38613546
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДобрыйКот,

и ещё, так никогда не делайте:

Код: c#
1.
2.
3.
        public AppStorage() 
            : base(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\ForumDatabaseFile.mdf;Integrated Security=True")
        { }



только так:

Код: c#
1.
2.
3.
        public AppStorage() 
            : base("DefaultConnection")
        { }



где, DefaultConnection — имя строки соединения, указанной в конфигурационном файле (web.config)
...
Рейтинг: 0 / 0
ASP.NET EF ICollection NULL
    #38613565
ДобрыйКот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

Спасибо большое, действительно пометив virtual коллекция при обращении начала грузиться. И это помогло понять вектор заскопок - а именно Loading Related Entities что со свзяками тут не всё так просто. Но конечно на обучалке с asp.net-та всё же не ясно почему без virtual-ов, .Include-ов но главное для изучения ASP хватит, так как он пока явзяется целевой изучаемой технологией

А по поводу конструктора с Connection String-ом это тестовый вариант, но мне больше нравятся варианты с нацеливанием на БД кодом, и заданием строчки подключения к примеру через Админку...

И ещё такой вопрос, в плане ресурсов и производительности общение с базой через Singleton Instance наследника DbContext будет лучше или хуже. Как бы логически - русурсов должно быть затрачено меньше, но в реальности это чёрный ящик.. Не подскажите чем Вы пользуетесь?
...
Рейтинг: 0 / 0
ASP.NET EF ICollection NULL
    #38613574
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДобрыйКотИ ещё такой вопрос, в плане ресурсов и производительности общение с базой через Singleton Instance наследника DbContext будет лучше или хуже. Как бы логически - русурсов должно быть затрачено меньше, но в реальности это чёрный ящик.. Не подскажите чем Вы пользуетесь?

правильно это Instance Per Request, т.е. один экземпляр DbContext на обработку запроса. но ни в коем случае не статический экземпляр!

ещё в учебных целях можно создавать DbContext по месту использования и тут же его уничтожать, вот так:

Код: c#
1.
2.
3.
4.
using(var db = new MyDbContext())
{
   // что-то делаем
}



но это неправильно. только для учебных примеров, или для совсем-совсем простых одноразовых задач. серьёзные дядьки так делать не должны, не подобает

я пользуюсь DI-контейнером (например, Autofac), который решает эту задачу.
...
Рейтинг: 0 / 0
ASP.NET EF ICollection NULL
    #38613585
ДобрыйКот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

Понятно, Спасибо за информацию
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / ASP.NET EF ICollection NULL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]