在Nop Commerce中创建插件时出错

时间:2016-10-18 09:22:58

标签: asp.net-mvc asp.net-mvc-4 nopcommerce

这是我在Nopcommerce中的第一个演示项目,我尝试制作自己的插件,但在构建期间出现了一些错误。以下是一些代码。

namespace Nop.Plugin.Aowi.Testimonial.Data
{
   public class TestimonialRecordObjectContext : DbContext , IDbContext
  {
    public TestimonialRecordObjectContext(string nameOrConnectionString) : base(nameOrConnectionString) { }

    #region Implementation of IDbContext

    #endregion

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

    public string CreateDatabaseInstallationScript()
    {
        return ((IObjectContextAdapter)this).ObjectContext.CreateDatabaseScript();
    }

    public void Install()
    {
        //It's required to set initializer to null (for SQL Server Compact).
        //otherwise, you'll get something like "The model backing the 'your context name' context has changed since the database was created. Consider using Code First Migrations to update the database"


     Database.SetInitializer<TestimonialRecordObjectContext>(null);
            Database.ExecuteSqlCommand(CreateDatabaseInstallationScript());
            SaveChanges();
        }

        public void Uninstall()
        {
            var dbScript = "DROP TABLE Testimonial";
            Database.ExecuteSqlCommand(dbScript);
            SaveChanges();
        }

        public new IDbSet<TEntity> Set<TEntity>() where TEntity : BaseEntity
        {
            return base.Set<TEntity>();
        }

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

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

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

这是依赖注册商部分

namespace Nop.Plugin.Aowi.Testimonial.Infastructure
 {
     public class DependencyRegistrar: IDependencyRegistrar
     {
         private const string CONTEXT_NAME ="nop_object_context_product_view_tracker";

    public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder, NopConfig config)
    {


        //data context
        this.RegisterPluginDataContext<TestimonialRecordObjectContext>(builder, CONTEXT_NAME);

        //override required repository with our custom context
        builder.RegisterType<EfRepository<TestimonialRecord>>()
            .As<IRepository<TestimonialRecord>>()
            .WithParameter(ResolvedParameter.ForNamed<IDbContext>(CONTEXT_NAME))
            .InstancePerLifetimeScope();
    }

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

即使在清洁和建筑物后,我也会收到此错误消息。 enter image description here

任何人都可以帮助我。我通过观看教程完成了所有这些,所以如果有人能帮助我纠正我的错误,我会非常感激。

2 个答案:

答案 0 :(得分:2)

您只需要在自定义上下文中实现错误日志中描述的IDbContext接口的此方法和属性。

例如,如何在现有的插件Tax.CountryStateZip中完成:

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

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

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

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

答案 1 :(得分:1)

我无法从您的代码中了解实际问题在哪里。但我建议举个例子。

使您的安装方法代码如下:

public void Install()
{
    //create the table
    var dbScript = CreateDatabaseScript();
    Database.ExecuteSqlCommand(dbScript);
    SaveChanges();
}

添加一个名为EfStartUpTask的新类并粘贴以下代码:

public class EfStartUpTask : IStartupTask
    {
        public void Execute()
        {
            //It's required to set initializer to null (for SQL Server Compact).
            //otherwise, you'll get something like "The model backing the 'your context name' context has changed since the database was created. Consider using Code First Migrations to update the database"
            Database.SetInitializer<YourContext>(null);
        }

        public int Order
        {
            //ensure that this task is run first 
            get { return 0; }
        }
    } 

您的DependencyRegistrar

public class DependencyRegistrar : IDependencyRegistrar
{
        public virtual void Register(ContainerBuilder builder, ITypeFinder typeFinder)
        {
            builder.RegisterType<YourService>().As<YourserviceInterface>().InstancePerLifetimeScope();

            //data context
            this.RegisterPluginDataContext<YourContext>(builder, "nop_object_context_product_view_tracker");

            //override required repository with our custom context
            builder.RegisterType<EfRepository<YourEntityClass>>()
                .As<IRepository<YourEntityClass>>()
                .WithParameter(ResolvedParameter.ForNamed<IDbContext>("nop_object_context_product_view_tracker"))
                .InstancePerLifetimeScope();
        }

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

注意:您必须将YourContext更改为您的上下文名称,并且与实体类相同

希望这有帮助!