دسته بندی
    بسته

    اتصال به دیتابیس در پلاگین

    7 سال پیش
    #801 نقل قول
    سلام به همه دوستان
    اگر در پلاگین جدیدی که نوشته می شه نیاز به اتصال با دیتابیس باشه بهترین راه برای این به چه شکل هست ؟  
    0
    7 سال پیش
    #805 نقل قول
    سلام.
    برای اتصال به دیتابیس شما باید یک کلاس ایجاد کرده که از DbContext ارث بری کند و همچنین اینترفیس IDbContext  را نیز پیاده سازی کند. بطور مثال

        public class MyDataContext : DbContext, IDbContext
        {
            public MyDataContext(string nameOrConnectionString) : base(nameOrConnectionString)
            {
            }
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                Database.SetInitializer<MyDataContext>(null);
                base.OnModelCreating(modelBuilder);
            }
            public string CreateDatabaseInstallationScript()
            {
                return ((IObjectContextAdapter)this).ObjectContext.CreateDatabaseScript();
            }

            public void Install()
            {
                var dbScript = CreateDatabaseInstallationScript();
                Database.ExecuteSqlCommand(dbScript);
                SaveChanges();
            }

            public void UnInstall()
            {
                //drop the table
                //this.DropPluginTable(this.GetTableName<CustomCategory>());
                //this.DropPluginTable(this.GetTableName<CustomSet>());
            }

            #region IDbContext
            IDbSet<TEntity> IDbContext.Set<TEntity>()
            {
                return base.Set<TEntity>();
            }

            public bool AutoDetectChangesEnabled
            {
                get => this.Configuration.AutoDetectChangesEnabled;
                set => this.Configuration.AutoDetectChangesEnabled = value;
            }

            public bool ProxyCreationEnabled
            {
                get => this.Configuration.ProxyCreationEnabled;
                set => this.Configuration.ProxyCreationEnabled = value;
            }

            public void Detach(object entity)
            {
                if (entity == null)
                    throw new ArgumentNullException(nameof(entity));

                ((IObjectContextAdapter)this).ObjectContext.Detach(entity);
            }

            public int ExecuteSqlCommand(string sql, bool doNotEnsureTransaction = false, int? timeout = default(int?), params object[] parameters)
            {
                throw new NotImplementedException();
            }

            public IList<TEntity> ExecuteStoredProcedureList<TEntity>(string commandText, params object[] parameters) where TEntity : BaseEntity, new()
            {
                throw new NotImplementedException();
            }

            public IEnumerable<TElement> SqlQuery<TElement>(string sql, params object[] parameters)
            {
                throw new NotImplementedException();
            }

            #endregion IDbContext
        }

    در قسمت OnModelCreating شما میتوانید mapping های خود را نسبت به جداول دیتابس اعمال نمایید.
    بطور مثال:

        public partial class MyTableMap : NopEntityTypeConfiguration<MyTable>
        {
            public MyTableMap ()
            {
                this.ToTable("MyTable");
                this.HasKey(x => x.Id);
    this.Property(x => x.Name).HasMaxLength(200);
            }
        }

    حالا mapping رو در OnModelCreating ثبت کنید:

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Configurations.Add(new MyTableMap());
            }


    مورد دیگه اینکه شما باید یک کلاس دیگر داشته باشید که رابط IDependencyRegistrar را پیاده سازی میکند.و سپس کلاس MyDbContext خود را در آن رجیستر میکنید.همانند زیر:

        public class DependencyRegistrar : IDependencyRegistrar
        {

            public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder, NopConfig config)
            {
                this.RegisterPluginDataContext<MyDataContext>(builder, "nop_object_context_Demo");

            }
            public int Order
            {
                get { return 0; }
            }
        }


    0
    7 سال پیش
    #809 نقل قول
    شما همچنین میتوانید برای ذخیره فیلدهای اضافی به جداول از قبل موجود ناپ کامرس به طور مثال جدول مشتری،از سرویس ISettingService استفاده نمایید.بطور مثال:
    من مدل زیر را دارم:

        public class MySettings : ISettings
        {
            public bool IsActivated { get; set; }
            public string Value{ get; set; }
        }



            public override void Install()
            {
                var settings = new MySettings
                {
                    IsActivated = true,
                    Value = "Test"
                };

                _settingService.SaveSetting(settings);
            }

    و برای برگرداندن مقدار آن از دیتابیس:

    var value = customer.GetAttribute<string>("Value");


    موفق باشید.
    0
    7 سال پیش
    #810 نقل قول
    ممنونم لطف کردین
    0
    دسته بندی ها