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

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

استفاده از genericRepository

دوشنبه, 30 اردیبهشت 1398 14:18

استفاده از genericRepository

با سلام

من طبق آموزش سی شارپ پیشرفته شما در تاپ لرن generic repository ایجاد کردم بر روب پروژه ام وی سی، حال طبق گفته شما اگر متد بیشتری بخواهیم باید یک repository جدید برای جدولمان ایجاد کنیم که از generic repository ارٍث بری کند من اینکار را انجام میدهم اما به مشکل بر میخورم روش خاص دارد اگر اینطور است میشه نمونه بگذارید

ﺳﻪ شنبه, 31 اردیبهشت 1398 08:22

سلام

متن ارور را بگذارید و نحوه ی کار خودتون را با جزییات توضیح بدهید

ﺳﻪ شنبه, 31 اردیبهشت 1398 10:17
using DataLayer.Context;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;

namespace DataLayer.Services
{
    public class GenericRepository<Tentity> where Tentity : class
    {
        private NORTHWNDEntities _db;
        private DbSet<Tentity> _dbSet;

        public GenericRepository(NORTHWNDEntities db)
        {
            _db = db;
            _dbSet = _db.Set<Tentity>();
        }

        public virtual IEnumerable<Tentity> Get(Expression<Func<Tentity, bool>> where = null)
        {
            IQueryable<Tentity> query = _dbSet;
            if (where != null)
            {
                query = query.Where(where);

            }
            return query.ToList();
        }
        public virtual Tentity GetById(object id)
        {
            return _dbSet.Find(id);
        }

        public virtual void Insert(Tentity entity)
        {
            _dbSet.Add(entity);
        }

        public virtual void update(Tentity entity)
        {
            _dbSet.Attach(entity);
            _db.Entry(entity).State = EntityState.Modified;
        }
        public virtual void Delete(Tentity entity)
        {
            if (_db.Entry(entity).State == EntityState.Detached)
            {
                _dbSet.Attach(entity);
            }
            _dbSet.Remove(entity);
        }
        public virtual void Delete(object Id)
        {
            var entity = GetById(Id);
            Delete(entity);

        }
    }
}

این کد generic

using DataLayer.Context;
using System.Collections.Generic;
using System.Linq;
using ViewModels;

namespace DataLayer.Repositories
{

    public class ProductRepositories:GenericRepository<NORTHWNDEntities db>
    {

        private NORTHWNDEntities db;

        public ProductRepositories(NORTHWNDEntities context)
        {
            db = context;
        }
        public List<ProductViewModel> LessData()
        {
            return db.Products.Select(c => new ProductViewModel()
            {
                ProductID = c.ProductID,
                ProductName = c.ProductName,
               // UnitPrice = Convert.ToDecimal(c.UnitPrice)
            }).ToList();
        }
    }

}

در اینجا میخوام ارث بری کنم چون یک متد جدید اضافه شده

خطایی که میده به رفرنس گیر میده 

ﺳﻪ شنبه, 31 اردیبهشت 1398 14:14

سلام خدمت شما دوست عزیز

در کلاس Generic ، هم Context و هم dbSet رو از حالت Private به Protected تغییر بدین

ProductRepositories باید از GenreciRepository<Product> ارث بری کنه که در این صورت شما هم به context  و dbset و هم به متد های اصلی Generic Repository دسترسی دارین و میتونین متدهای جدیدتون رو پیاده سازی کنین

چهارشنبه, 01 خرداد 1398 08:56

سلام

من اصلا نمیدونم چرا جناب مدائنی یه همچین چیزی رو آموزش داده.

خود EntityFramework بر اساس الگوی UnitOfWork , Repository ساخته شده و اینکار در حالت عادی خیلی بیهوده است . هیچ چیزی به کد اضافه نمیکنه.

شاید تو یه سری ‌businessهای خاص نیاز باشه که متد‌های base رو proxy کنیم تا یه سری پیش شرط‌ها رو تحمیل برنامه‌نویس کنیم یا از اشتباهات در Load ابتدایی داده‌ها جلوگیری کنیم. تو این مورد خاص به درد میخوره ولی در حالت عادی فقط یه انتزاع بی‌کاربرد ایجاد شده.

ای کاش این Generic Repositry رو با Dapper آموزش میدادین! Entity Framework اومده که ما اینکار رو نکنیم!

چهارشنبه, 01 خرداد 1398 10:46
شنبه, 04 خرداد 1398 12:46

سلام کسی می تونه کمکم کنه ؟؟؟؟؟؟؟؟؟

دوشنبه, 06 خرداد 1398 01:04

سلام

GenericRepository داخلش سازندش از db رو داره دریافت میکنه که باید توی ProductRepositories بهش بدی.

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

:base(db)

ارسال پاسخ برای این تاپیک

ارسال پاسخ مخصوص اعضا سایت می باشد ! میتوانید با حساب کاربری خود وارد سایت شده یا ثبت نام کنید