پنج شنبه, ۰۲ آذر ۱۳۹۶ ۰۸:۵۰:۰۰

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

16 روز قبل
#801 نقل و قول
سلام به همه دوستان
اگر در پلاگین جدیدی که نوشته می شه نیاز به اتصال با دیتابیس باشه بهترین راه برای این به چه شکل هست ؟  
0
16 روز قبل
#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
16 روز قبل
#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
15 روز قبل
#810 نقل و قول
ممنونم لطف کردین
0