Модульный AspnetBoilerplate: тип сущности XXX не является частью модели для текущего контекста.

Извините за мой плохой английский, может ли кто-нибудь помочь мне с этой ошибкой, как показано ниже:

Я следил за этим руководством, чтобы создать новое модульное приложение (с именем Payment) на платформе AspnetZero (с именем FastOne).

Во втором контексте DbContext я изменяю соединение по умолчанию для моей второй базы данных и добавляю новое имя объекта BankCode. После добавления-миграции и обновления-базы все работает нормально. Новая база данных была создана с 1 именем таблицы BankCode

Я пошел создать AppService в проекте модуля .Application, как показано ниже:

public class BankCodeAppService : FastOneAppServiceBase, IBankCodeAppService
    {
        //from PaymentDbContext
        private readonly IRepository<BankCode> _repository;

        public BankCodeAppService(IRepository<BankCode> repository)
        {
            _repository = repository;
        }

       public ListResultDto<BankCodeDto> GetAllBankCodeDto()
        {
            try
            {
                var result = _repository.GetAll().ToList();
                return new ListResultDto<BankCodeDto>(result.MapTo<List<BankCodeDto>>());
            }
            catch (Exception ex)
            {
                throw new NotImplementedException();
            }
        }
    }

Это мой PaymentDbContext

[DefaultDbContext]
    [AutoRepositoryTypes(
        typeof(IPaymentRepositoryBase<>),
        typeof(IPaymentRepositoryBase<,>),
        typeof(PaymentRepositoryBase<>),
        typeof(PaymentRepositoryBase<,>)
    )]
    public class PaymentDbContext : FastOneDbContext
    {
        /* Define an IDbSet for each entity of the application */

        public virtual IDbSet<BankCode.BankCode> BankCodes { get; set; }

        //TODO: Define an IDbSet for your Entities...
        public PaymentDbContext() : base("SecondConn") { }
        public PaymentDbContext(string nameOrConnectionString) : base(nameOrConnectionString) { }
        public PaymentDbContext(DbConnection connection) : base(connection) { }
    }

API был успешно создан, но когда я позвонил ему, он вернул ошибку, как показано ниже:

Тип сущности BankCode не является частью модели для текущего контекста.

Я попытался отладить и понять, что репозиторий FastOneDbContext вместо PaymentDbContext: [Неверный репозиторий при отладке] [2] Я совершенно новичок в AspNetBoilerplate и модуле Zero. Так что может кто-нибудь помочь мне. Благодарить

Обновление: это мой PaymentRepositoryBase

namespace FastOne.EntityFramework.Repositories
{
    public class PaymentRepositoryBase<TEntity, TPrimaryKey> : FastOneRepositoryBase<TEntity, TPrimaryKey>
        where TEntity : class, IEntity<TPrimaryKey>
    {
        public PaymentRepositoryBase(IDbContextProvider<PaymentDbContext> dbContextProvider) : base(dbContextProvider) { }
        //do not add any method here, add to the class above (since this inherits it)
    }
    public abstract class PaymentRepositoryBase<TEntity> : PaymentRepositoryBase<TEntity, int>
        where TEntity : class, IEntity<int>
    {
        public PaymentRepositoryBase(IDbContextProvider<PaymentDbContext> dbContextProvider) : base(dbContextProvider) { }
        //do not add any method here, add to the class above (since this inherits it)
    }
}

Обновление 3. Спасибо за помощь, Аарон, все идет правильно, это новейшая ошибка, я искал некоторые решения, но они не работали. Пожалуйста помоги

Компонент для поддержки сервиса FastOne.EntityFramework.PaymentDbContext не найден.

Обновление 4. Я попытался добавить этот метод в PaymentDataModule:

public override void Initialize()
        {
            IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
        }

Это сработало !, я вижу, что _repository получает правильный контекст. но когда я бегу, это вызвало эту ошибку:

System.Data.SqlClient.SqlException: недопустимое имя объекта "dbo.BankCode".

Я понял, что подключение было неправильным. Это был контекст первого контекста

Обновление 5: я обнаружил, что у меня есть 3 конструктора в PaymentDbContext. Итак, я удалил эти строки:

public PaymentDbContext() : base("LocalPaymentConn") { }
        //public PaymentDbContext(string nameOrConnectionString) : base(nameOrConnectionString) { }
        //public PaymentDbContext(DbConnection connection) : base(connection) { }

-> Он получил правильную строку подключения. Так круто!! Спасибо Аарону и Тьену за вашу помощь. Спасибо


person Hoang Tran    schedule 19.09.2017    source источник


Ответы (2)


Вам следует ввести IPaymentRepositoryBase, как вы указали в AutoRepositoryTypes.

public class BankCodeAppService : FastOneAppServiceBase, IBankCodeAppService
{
    private readonly IPaymentRepositoryBase<BankCode> _repository;

    public BankCodeAppService(IPaymentRepositoryBase<BankCode> repository)
    {
        _repository = repository;
    }
}

Обновление 1

ComponentActivator: не удалось создать экземпляр FastOne.EntityFramework.Repositories.PaymentRepositoryBase`1‌ [[FastOne.BankCode.B‌ ankCode, FastOne.Payment.Core, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]]

Удалите ключевое слово abstract из объявления класса для PaymentRepositoryBase<TEntity>.


Обновление 2

Целевой объект не реализует интерфейс FastOne.Domain.Repositories.IPaymentRepositoryBase`1 [[FastOn‌ e.BankCode.BankCode, FastOne.Payment.Core, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = null]] \ r \ nИмя параметра : цель

Сделайте PaymentRepositoryBase орудие IPaymentRepositoryBase.

public class PaymentRepositoryBase<TEntity> : PaymentRepositoryBase<TEntity, int>, IPaymentRepositoryBase<TEntity>
    where TEntity : class, IEntity<int>
{
    public PaymentRepositoryBase(IDbContextProvider<PaymentDbContext> dbContextProvider) : base(dbContextProvider) { }
}
person aaron    schedule 19.09.2017

Вы используете многократный dbcontext в приложении. Таким образом, второй контекст должен быть унаследован от AbpDbContext, чтобы ABP правильно ввести это. См. MultipleDbContextDemo пример в https://github.com/aspnetboilerplate/aspnetboilerplate-samples.

Надеюсь, что это поможет вам.

person tiennguyen    schedule 20.09.2017