مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

valentine093

عضویت از 1394/10/10

مشکل لود تمام جداول دیتابیس در کانتکس Entity Framwork Core

  • چهارشنبه 11 بهمن 1396
  • 09:49
تشکر میکنم

با سلام خدمت اساتید.

من در ef core 2 به روش DB First یه پروژه ای رو شروع کردم و مشکلی که دارم اینه که هنگام مقدار پر شدن کانتکس کل دیتابیس با دیتا های جداول رو روی کانتکست لود میکنه.یعنی یه SnapShot  از دیتابیس رو روی Ram  نگه میداره که فاجعه است!!!

در صورتیکه در Ef معمولی این مشکل رو نداریم

ممنون میشم اساتید راهنمایی کنن

در ضمن من از UnitOfwork  و Repository  پترن استفاده میکنم

پاسخ های این پرسش

تعداد پاسخ ها : 15 پاسخ
کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • چهارشنبه 11 بهمن 1396
  • 09:58

چگونه اطلاعات را واکشی می کنید لطفا کدتون رو قرار بدید.

کاربر سایت

valentine093

عضویت از 1394/10/10

  • چهارشنبه 11 بهمن 1396
  • 10:44

با سلام و تشکر.

داخل کلاس startup.cs

         services.AddMvc()
                .AddJsonOptions(
                    options => options.SerializerSettings.ReferenceLoopHandling =
                        Newtonsoft.Json.ReferenceLoopHandling.Ignore
                );

            var basePath = Directory.GetCurrentDirectory();

            var configuration = new ConfigurationBuilder()
                .SetBasePath(basePath)
                .AddJsonFile("appsettings.json")

                .Build();

            services
                .AddDbContext<ArchiveContext>(options =>
                        options.UseSqlServer(configuration.GetConnectionString("DefaultConnection")),ServiceLifetime.Scoped
                );

کاربر سایت

valentine093

عضویت از 1394/10/10

  • چهارشنبه 11 بهمن 1396
  • 10:47

کلاس UnitOfwork.cs


    public class UnitOfWork : IUnitOfWork
    {
        private  ArchiveContext _context;

        public  UnitOfWork(ArchiveContext context)
        {
            _context = context;
        }   

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// Disposes all external resources.
        /// </summary>
        /// <param name="disposing">The dispose indicator.</param>
        private void Dispose(bool disposing)
        {
            if (!disposing) return;
            if (_context == null) return;

            _context.Dispose();
            _context = null;
        }

        /// <summary>
        /// متد ذخیره تمام کانتکس ها
        /// </summary>
        public async Task<int> SaveChanges()
        {
            var res= await _context.SaveChangesAsync();
            return  res;
        }

        public DbSet<T> EntitySet<T>() where T : class
        {
            return _context.Set<T>();
        }

کاربر سایت

valentine093

عضویت از 1394/10/10

  • چهارشنبه 11 بهمن 1396
  • 10:50

در قسمت

   public  UnitOfWork(ArchiveContext context)
    {
        _context = context;
    }

زمانیکه کانتکست رو با ز میکنم تمام DBSET  ها مقدار دارن

حتی در حالت غیر دیباگینگ و Realse

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • چهارشنبه 11 بهمن 1396
  • 11:01

Dbset ها نباید null باشند برای این که بررسی کنید داده ای بارگذاری شده باید local هر dbset را بررسی کنید.

آیا منظور شما از مقادیر Dbset ها، همان Local است ؟

Ef به صورت خودکار چنین کاری نمی کند. زمانی local هر DbSet پر می شود که شما از دو متد Load و Find استفاده کنید. که این دو موجودیت ها (Entities) را در دورن حافظه (In-Memory) نگه داری می کند.

کاربر سایت

valentine093

عضویت از 1394/10/10

  • چهارشنبه 11 بهمن 1396
  • 11:27

با توجه به ضمیمه ای که فرستادم هم Local  و هم Resulat  حاوی مقادیر هستند

فایل های ضمیمه

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • چهارشنبه 11 بهمن 1396
  • 11:48

ازتون میخوام از نرم افزار Entity Framework Profiler استفاده کنید تا مشاهده کنیم چه زمانی توسط چه متدی این کار انجام می شود. شاید هم مشکل در خود EF Core باشد در این صورت باید آن را گزارش بدهیم.

نسخه EF Core رو قرار بدید.

کاربر سایت

valentine093

عضویت از 1394/10/10

  • چهارشنبه 11 بهمن 1396
  • 11:57

ممنون خیلی زحمت دادم من کل اینترنت رو 2 روزه زیر و رو میکنم چیزی پیدا نکردم

ورژن هم 2.0.1 که آخرین ver Stable  هست

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • چهارشنبه 11 بهمن 1396
  • 12:02

اول EF Profiler رو دانلود کنید و نصب کنید (راهنمایی خواستید همیجا بپرسید)

هم زمان با اون اول نسخه رو به 2.0.0 تغییر بدید و دوباره بررسی کنید.

کاربر سایت

valentine093

عضویت از 1394/10/10

  • چهارشنبه 11 بهمن 1396
  • 14:44

مهندس این نرم افزار برای ef core پشتیبانی نمیشه

چند تا هم برای core  نگاه کردم ویژوال نیستش

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • چهارشنبه 11 بهمن 1396
  • 16:26

میشه; بنده ازش استفاده می کنم و روی EF Core هم تستش کردم. 

زمانی که نم افزار رو دانلود کردید به پوشه Adapter مراجعه کنید سپس پوشه netstandard1.6 و فایل "HibernatingRhinos.Profiler.Appender.dll" به پروژه اضافه بکنید.

پس از آن کد زیر را داخل سازنده DbContext قرار بدید:

 HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.InitializeForProduction()

کاربر سایت

valentine093

عضویت از 1394/10/10

  • پنجشنبه 12 بهمن 1396
  • 12:23

سلام.ممنون مهندس

وقتی با پروفایلر تست کردم مشخص شد توی Quick Watch  (که عکسش رو ضمیمه کرده بودم )زمانیکه یه Dbset رو باز میکنی تا دیتاش رو ببینی همومن لحظه یک درخواست به sql میفرسته و اون لحظه میاره.و الا اگر برای بدست آوردن اطلاعات جدول مثلا user  کدی را اجرا کنیم (در EF) فقط درخواست جدول user  به SQL میره.

از زحمات شما هم ممنون این پروفایلر خیلی کمک کرد

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • پنجشنبه 12 بهمن 1396
  • 12:26

استفاده از Profiler ها و سیستم logging که در  NET Core. تهیه شده برای بررسی مسائل این چنینی بسیار مناسب است. 

به Performance اهمیت بدید.

کاربر سایت

valentine093

عضویت از 1394/10/10

  • پنجشنبه 12 بهمن 1396
  • 23:34

حتما.باعث افتخاره که ازتجریبات شما استفاده کنم.فقط یه سوال ! مثل اینکه Lazy Loading  توی .net core  نیستش.راهی برای این کار پیدا کردین؟؟ببخشین اگه پر رپویی میکنم

کاربر سایت

سهیل علیزاده

عضویت از 1396/04/09

  • پنجشنبه 12 بهمن 1396
  • 23:47

قرار است در نسخه 2.1 این امکان اضافه بشه.

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)