با سلام خدمت اساتید.
من در ef core 2 به روش DB First یه پروژه ای رو شروع کردم و مشکلی که دارم اینه که هنگام مقدار پر شدن کانتکس کل دیتابیس با دیتا های جداول رو روی کانتکست لود میکنه.یعنی یه SnapShot از دیتابیس رو روی Ram نگه میداره که فاجعه است!!!
در صورتیکه در Ef معمولی این مشکل رو نداریم
ممنون میشم اساتید راهنمایی کنن
در ضمن من از UnitOfwork و Repository پترن استفاده میکنم
چگونه اطلاعات را واکشی می کنید لطفا کدتون رو قرار بدید.
با سلام و تشکر.
داخل کلاس 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 );
کلاس 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>(); }
در قسمت
public UnitOfWork(ArchiveContext context) { _context = context; }
زمانیکه کانتکست رو با ز میکنم تمام DBSET ها مقدار دارن
حتی در حالت غیر دیباگینگ و Realse
Dbset ها نباید null باشند برای این که بررسی کنید داده ای بارگذاری شده باید local هر dbset را بررسی کنید.
آیا منظور شما از مقادیر Dbset ها، همان Local است ؟
Ef به صورت خودکار چنین کاری نمی کند. زمانی local هر DbSet پر می شود که شما از دو متد Load و Find استفاده کنید. که این دو موجودیت ها (Entities) را در دورن حافظه (In-Memory) نگه داری می کند.
ازتون میخوام از نرم افزار Entity Framework Profiler استفاده کنید تا مشاهده کنیم چه زمانی توسط چه متدی این کار انجام می شود. شاید هم مشکل در خود EF Core باشد در این صورت باید آن را گزارش بدهیم.
نسخه EF Core رو قرار بدید.
ممنون خیلی زحمت دادم من کل اینترنت رو 2 روزه زیر و رو میکنم چیزی پیدا نکردم
ورژن هم 2.0.1 که آخرین ver Stable هست
اول EF Profiler رو دانلود کنید و نصب کنید (راهنمایی خواستید همیجا بپرسید)
هم زمان با اون اول نسخه رو به 2.0.0 تغییر بدید و دوباره بررسی کنید.
مهندس این نرم افزار برای ef core پشتیبانی نمیشه
چند تا هم برای core نگاه کردم ویژوال نیستش
میشه; بنده ازش استفاده می کنم و روی EF Core هم تستش کردم.
زمانی که نم افزار رو دانلود کردید به پوشه Adapter مراجعه کنید سپس پوشه netstandard1.6 و فایل "HibernatingRhinos.Profiler.Appender.dll" به پروژه اضافه بکنید.
پس از آن کد زیر را داخل سازنده DbContext قرار بدید:
HibernatingRhinos.Profiler.Appender.EntityFramework.EntityFrameworkProfiler.InitializeForProduction()
سلام.ممنون مهندس
وقتی با پروفایلر تست کردم مشخص شد توی Quick Watch (که عکسش رو ضمیمه کرده بودم )زمانیکه یه Dbset رو باز میکنی تا دیتاش رو ببینی همومن لحظه یک درخواست به sql میفرسته و اون لحظه میاره.و الا اگر برای بدست آوردن اطلاعات جدول مثلا user کدی را اجرا کنیم (در EF) فقط درخواست جدول user به SQL میره.
از زحمات شما هم ممنون این پروفایلر خیلی کمک کرد
استفاده از Profiler ها و سیستم logging که در NET Core. تهیه شده برای بررسی مسائل این چنینی بسیار مناسب است.
به Performance اهمیت بدید.
حتما.باعث افتخاره که ازتجریبات شما استفاده کنم.فقط یه سوال ! مثل اینکه Lazy Loading توی .net core نیستش.راهی برای این کار پیدا کردین؟؟ببخشین اگه پر رپویی میکنم
قرار است در نسخه 2.1 این امکان اضافه بشه.
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)