ورود

View Full Version : ارور constructor در AddDbContextPool



elham9
دوشنبه 04 تیر 1397, 17:43 عصر
سلام

من میخام بجای adddbcontext از AddDbContextPool استفاده کنم . اما ارور زیر رو دارم . ممنون میشم راهنمایی کنید .

DataContext :


public class DataContext : IdentityDbContext<User> {
public DataContext(DbContextOptions options) : base(options)
{
}


public DataContext()
{
}


protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<User>().ToTable("Users");
}
}




startup :


services.AddDbContextPool<DataContext>(options =>
options.UseSqlServer(connection)));

ارور :


InvalidOperationException: The DbContext of type 'DataContext' cannot be pooled because it does not have a single public constructor accepting a single parameter of type DbContextOptions.

Moien Tajik
دوشنبه 04 تیر 1397, 20:00 عصر
Constructor ای که بدون پارامتر هست رو حذف کنید.

elham9
دوشنبه 04 تیر 1397, 22:49 عصر
ممنون . اگه کانستراکتور خالی رو بردارم درست جواب میده منتها زمانیکه بخام یه شی جدید رو در ریپازیتوری از datacontext بسازم خطا میده .


public class MenuRepository : IDisposable {
private DataContext database = null;
public MenuRepository()
{
database = new DataContext();
}

اینم ارور :


There is no argument given that corresponds to the required formal parameter 'options' of 'DataContext.DataContext(DbContextOptions)'

hakim22
سه شنبه 05 تیر 1397, 12:04 عصر
اول اینکه شما نیاز به IDisposable ندارید. دوم اینکه باید از تزریق وابستگی استفاده کنید.


public class MenuRepository : IDisposable {
private DataContext _database;
public MenuRepository(DataContext database)
{
_database=database;
}

}


ضمن اینکه باید در Startup سرویس را اضافه کنید.


public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<MenuRepository, MenuRepository>();
}


استفاده از AddDbContextPool هم هیچ فایده ای در این پروژه نداره و فقط کار شمارو پیچیده تر میکنه. از همون AddDbContext استفاده کنید.

elham9
سه شنبه 05 تیر 1397, 22:20 عصر
بسیار ممنون از پاسختون .
چرا نیازی به IDisposable نیست ؟؟من تازه میخام با ریپازیتوری کار کنم و چندتا مطلب خوندم همه مبنی بر اینکه اینترفیسی بسازیم و ریپازیتوریها رو از اون مشتق کنیم و این اینترفیس از idisposable ارث ببره ویه سری مزایا برای استفاده از اون بر شمرده بودن که در سرعت و کارایی تاثیر گذار هست

hakim22
چهارشنبه 06 تیر 1397, 12:46 عصر
اول اینکه 60 تا 70 درصد سایتها نیازی به لایه ی ریپوزیتوری ندارن. صرف اینکه یک الگویی وجود داره مجبور نیستید پیادش کنید.



چرا نیازی به IDisposable نیست ؟


در دات نت Garbage Collection (تخلیه ی حافظه)همیشه انجام میشه. اما اینکه چه زمانی انجام میشه دست شما نیست. دست خود فریم ورکه. وقتی از دستور IDisposable استفاده می کنید یعنی قصد دارید خودتون پاکسازی حافظه رو کنترل کنید. اگر شما نمی دونید که کی و کجا باید حافظه رو خالی کنید بهتره این کار رو به خود فریم ورک بسپارید. خالی کردن بی مورد حافظه بازدهی سیستم رو کم میکنه.

در بعضی موارد عدم استفاده از IDisposable باعث ایجاد Memory Leak میشه و حافظه در زمان درست تخلیه نمیشه. در نتیجه پروژه ی شما بی مورد کند میشه. Memory Leak در بسیاری از پروژه ها خودش رو نشون نمیده. فقط در ترافیک بالا هست که ناگهان اثر میکنه. اینکه شما از روز اول پروژه دنبال جلوگیری از Memory Leak باشید خوبه ولی واقعیت اینه که ممکنه هیچوقت به اون حالت نرسید و وقت و انرژی زیادی رو صرف هیچ کردید.

در مورد دیتابیس ها خوبه که استفاده کنید. چون همشون به نوعی از دات نت خارج میشن و وارد کدهایی معروف به Un managed میشن. اما استفاده از IDisposable نباید پیشفرض شما باشه.

هر کسی سبک خودش رو در کد نویسی داره. بعضی ها دوست دارن پروژه رو دفاعی پیاده کنن و از همون اول چند لایه ی محافظ دور قایق بکشن که مطمئن باشن سوراخ نمیشه. فرق هم براشون نداره کجا قراره قایق سواری کنن. بعضی ها هم نگاه میکنن به شرایط ، آیا قراره دریا نوردی کنن یا تو یک برکه دور بزنن. دل رو میزنن به دریا میگن اگر سوراخ شد پر می کنیم. بسته به اینکه روی چه پروژه ای کار می کنید شرایط فرق میکنه.

سرعت و کارایی Repository جای بحث داره. در همه ی پروژه ها لزوما اینطور نیست.

پیشنهاد من به شما اینه که از چیزی که نمیدونید چه کاری انجام میده استفاده نکنید تا الزام استفاده از اون رو احساس کنید.