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

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

کاربر سایت

negarin

عضویت از 1396/01/05

استفاده از genericRepository

  • دوشنبه 30 اردیبهشت 1398
  • 14:18
تشکر میکنم

با سلام

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

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

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

AmirGhasemi

عضویت از 1392/02/25

  • سه شنبه 31 اردیبهشت 1398
  • 08:22

سلام

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

کاربر سایت

negarin

عضویت از 1396/01/05

  • سه شنبه 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();
        }
    }

}

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

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

کاربر سایت

محمد اردوخانی

عضویت از 1396/05/17

  • سه شنبه 31 اردیبهشت 1398
  • 14:14

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

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

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

کاربر سایت

salman_b

عضویت از 1396/02/18

  • چهارشنبه 1 خرداد 1398
  • 08:56

سلام

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

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

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

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

کاربر سایت

negarin

عضویت از 1396/01/05

  • چهارشنبه 1 خرداد 1398
  • 10:46

کاربر سایت

negarin

عضویت از 1396/01/05

  • شنبه 4 خرداد 1398
  • 12:46

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

کاربر سایت

salman_b

عضویت از 1396/02/18

  • دوشنبه 6 خرداد 1398
  • 01:04

سلام

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

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

:base(db)

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

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

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

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