Entity Framework 6 da Generic Repository Patterndan foydalanish.
Generic haqida tushuncha:
.Net 2.0 dan boshlab Genericlardan foydalanish imkoniyati qo’shildi. Generic yordamida ixtiyoriy tipda ishlovchi(ixtiyoriy tipga moslashuvchi) metod yoki class yaratish mumkin. Bunda class yoki metod tipi uchun maxsus shablon belgisi — «T» dan foydalaniladi. Kompilyator har bir tipga mos shu tipdagi metod yoki classni generatsiya qiladi. Generic dan foydalanish uchun “using” bo’limiga using System.Collections.Generic; ni qo’shish lozim.
Masalan:
1)
using System; using System.Collections.Generic; namespace GenericApplication { public class MyGenericArray<T> { private T[] array; public MyGenericArray(int size) { array = new T[size + 1]; } public T getItem(int index) { return array[index]; } public void setItem(int index, T value) { array[index] = value; } } class Tester { static void Main(string[] args) { //Butun tipdagi massivni e’lon qilish: MyGenericArray<int> intArray = new MyGenericArray<int>(5); //Massiv elementlariga qiymat berish: for (int c = 0; c < 5; c++) { intArray.setItem(c, c*5); } //Massiv elementlarini chop qilish Console.Write("Butun tipli massiv elementlari:"); for (int p = 0; p < 5; p++) { Console.Write(intArray.getItem(p) + " "); } Console.WriteLine(); //Belgi tipidagi massivni hosil qilish: String myName=”Nosirbek”; MyGenericArray<char> charArray = new MyGenericArray<char>(5); for (int c = 0; c < myName.Length; c++) { charArray.setItem(c, myName[c]); } Console.Write("Belgi tipidagi massiv elementlari:"); for (int p = 0; p< myName.Length; p++) { Console.Write(charArray.getItem(p) + " "); } Console.WriteLine(); Console.ReadKey(); } } }
Dasturni ishga tushirgach quyidagi natijani olishimiz mumkin:
0 5 10 15 20
N o s i r b e k
Generic metodlar:
Generic yordamida universal tip parametriga ega bo’lgan metod yaratishimiz mumkin
Masalan:
2)
using System; using System.Collections.Generic; namespace GenericTest1 { class Program { private static void swap<K>(ref K p1,ref K p2) { Console.WriteLine("p1={0}, p2={1}",p1,p2); K temp = p1; p1 = p2; p2 = temp; Console.WriteLine("p1={0}, p2={1}", p1, p2); Console.WriteLine("----------------------"); } static void Main(string[] args) { int a = 10, b = 25; swap(ref a, ref b); string firstName = "Mansur", lastName = "Kurtov"; swap(ref firstName, ref lastName); Console.ReadLine(); } } }
Natija:
Generic Repository Pattern:
1) Yangi Consule Application yaratamiz va unda “Models” deb nomlangan papka hosil qilamiz. Uning ichiga Person.cs nomli classni qo’shamiz.
Pesron.cs:
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace EntityCrudApp2.Model { [Table("Pesons", Schema = "dbo")] //Bazadagi jadval nomi – “Persons” public class Person { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] //Primery key public int Id { get; set; } [Required] [StringLength(250)] //'Not nul'(bo'sh qiymat qabul qilmaydi) va uzunligi 250 bo’lgan belgi public string Name { get; set; } } }
2) Proyekt ichida “Repository” papkasini hosil qilamiz va unga “IMyRepository” interfeysini va “MyRepository” classini qo’shamiz.
IMyRepository.cs:
using System; using System.Data.Entity; using System.Linq; using System.Linq.Expressions; namespace EntityCrudApp2.Repository { public interface IMyRepository<T> : IDisposable where T : class { DbContext Context { get; } IQueryable<T> All(); IQueryable<T> Filter(Expression<Func<T, bool>> predicate); bool Contains(Expression<Func<T, bool>> predicate); T Find(params object[] keys); T Find(Expression<Func<T, bool>> expression); T Create(T t); int Delete(T t); int Delete(Expression<Func<T, bool>> predicate); int Update(T t); void Execute(string command, params object[] parameters); void SaveChanges(); } }
MyRepository.cs:
using System; using System.Data.Entity; using System.Linq; using System.Linq.Expressions; using EntityCrudApp2.DB; namespace EntityCrudApp2.Repository { public class MyRepository<T> : IMyRepository<T> where T : class { public DbContext Context { get; private set; } public MyRepository() : this(new DbContext()) { String s; int k=s.Length } public MyRepository(DbContext context) { Context = context; } public IQueryable<T> All() { return Filter(null); } public IQueryable<T> Filter(Expression<Func<T, bool>> predicate) { var query = Context.Set<T>(); return predicate!=null ? query.Where(predicate) : query; } public bool Contains(Expression<Func<T, bool>> predicate) { return Find(predicate) != null; } public T Find(params object[] keys) { return Context.Set<T>().Find(keys); } public T Find(Expression<Func<T, bool>> expression) { return Context.Set<T>().FirstOrDefault(expression); } public T Create(T t) { Context.Entry(t).State = EntityState.Added; Context.Set<T>().Add(t); SaveChanges(); return t; } public int Delete(T t) { Context.Entry(t).State = EntityState.Deleted; Context.Set<T>().Remove(t); SaveChanges(); return 0; } public int Delete(Expression<Func<T, bool>> predicate) { var t = Find(predicate); Context.Entry(t).State = EntityState.Deleted; Context.Set<T>().Remove(t); SaveChanges(); return 0; } public int Update(T t) { Context.Entry(t).State=EntityState.Modified; Context.Set<T>().Attach(t); SaveChanges(); return 0; } public void Execute(string command, params object[] parameters) { Context.Database.ExecuteSqlCommand(command, parameters); // Stored proceduralarni ishga tushirish uchun ishlatiladi SaveChanges(); } public void SaveChanges() { Context.SaveChanges(); } public void Dispose() { Context.Dispose(); } } }
Modelga mos jadvallani hosil qilish uchun qo’shimcha Configuration.cs classini hozil qilamiz. Buning uchun proyektga “Migrations” nomli papka qo’shamiz.
Configuration.cs:
namespace EntityCrudApp2.Migrations { using System.Data.Entity.Migrations; internal sealed class Configuration : DbMigrationsConfiguration<EntityCrudApp2.DB.DbContext> { public Configuration() { AutomaticMigrationsEnabled = true; } } }
“app.config” faylida Dbga bog’lanish uchun kerak bo’ladigan connectionString ni aniqlab qo’yamiz:
app.config:
<connectionStrings> <add name="myConnectionString" connectionString="Data Source=.;Initial Catalog=MansurDB1;User Id=sa;password=mansur;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.EntityClient" /> </connectionStrings>
Proyektda DB deb nomlangan papka hosil qilamiz va uning ichiga DbConfig.cs va DBContext.cs classlarini qo’shamiz:
DbConfig.cs:
using System.Data.Entity; namespace EntityCrudApp2.DB { public static class DbConfig { public static void Configure() { Database.SetInitializer(new MigrateDatabaseToLatestVersion<DbContext, Migrations.Configuration>()); } } }
DBContext.cs:
using System.Configuration; using System.Data.Entity; using System.Data.Entity.ModelConfiguration.Conventions; using EntityCrudApp2.Model; namespace EntityCrudApp2.DB { public class DBContext : DbContext { private static readonly string ConnectionString; static DBContext() { ConnectionString = ConfigurationManager.ConnectionStrings["myConnectionString "].ConnectionString; } public DbContext() : base(ConnectionString) { } public DbSet<Person> Persons { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } } }
Endi yaratilgan Repositorydan foydalanib bazada model bo’yicha jadvalni hosil qilish va unda CRUD(Create, Read, Update, Delete) amallarini bajarishimiz mumkin:
Program.cs:
using System; using EntityCrudApp2.DB; using EntityCrudApp2.Model; using EntityCrudApp2.Repository; namespace EntityCrudApp2 { class Program { static void Main(string[] args) { DbConfig.Configure(); using (IMyRepository<Person> repository = new MyRepository<Person>()) { repository.Create(new Person { Name = "Programmer 1" }); Console.WriteLine("Bazaga qo'shilgan 'Person'lar ro'yxati:"); foreach (var person in repository.All()) { Console.WriteLine(person.Name); } } Console.ReadLine(); } } }
Natija:
Bazaga qo'shilgan 'Person'lar ro'yxati:
Programmer 1
Top comments (0)