The entity type is not part of the model for the current context
От: qwert_ukg  
Дата: 23.07.15 04:07
Оценка:
Добрый день!

Сразу скажу, я недавно в C# и в .NET, до этого 10 лет писал на пхп.

Так вот, у меня есть приложение в котором в БД я добавил пару полей, перегенерил (не обновил — там не стандартный .edmx, а сторонним самодельным генератором сделан) модель с БД и шаблонами создал классы моделей. При первом запуске я получил ошибку вида The entity type is not part of the model for the current context. Почитав интернеты я понял что необходимо базе дать понять что контекст обновился. Как правильно это сделать я толком не понял, но сменив IP в строке подключения на неверный, а патом обратно, все сущности сразу нашлись в конексте БД, за исключением тех которые брались не из таблиц а из вьюшек. То есть работает все приложение кроме тех мест где сущности запрашиваются из SQL представлений.

Мне кажется я просто не понимаю как перечитать контекст БД после изменений в ней.

Вот мой EFModel.Context

public partial class DrugRegisterContainer : DbContext
{
    public DrugRegisterContainer()
        : base(SingleDbConnection.Get("EntityModels.DrugRegister"))
    {
    }

    public DrugRegisterContainer(string nameOrConnectionString)
        : base(nameOrConnectionString)
    {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    protected override DbEntityValidationResult ValidateEntity(DbEntityEntry entityEntry, IDictionary<object, object> items)
    {
        var result = base.ValidateEntity(entityEntry, items);
        var type = entityEntry.Entity.GetType();
        var toDelete = result.ValidationErrors.Where(o => !IsPrimitiveMember(o.PropertyName, type)).ToArray();
        toDelete.ForEach(o => result.ValidationErrors.Remove(o));
        return result;
    }

    private bool IsPrimitiveMember(string memberName, Type type)
    {
        var pi = type.GetProperty(memberName, BindingFlags.Instance | BindingFlags.Public);
        if (pi != null)
            return pi.PropertyType.IsPrimitive;

        var fi = type.GetField(memberName, BindingFlags.Instance | BindingFlags.Public);
        if (fi != null)
            return fi.FieldType.IsPrimitive;

        return false;
    }

    public DbSet<MZ_DicOrgPravForm> MZ_DicOrgPravForm { get; set; }
    ...
    public DbSet<DR_V_RegistrationReport> DR_V_RegistrationReport { get; set; }
}

public partial class DrugRegisterContainerTypesRegistrar : ITypesRegistrar
{
    public void RegisterTypes()
    {
        DbContexts.Default.RegisterContext<MZ_DicOrgPravForm, DrugRegisterContainer>();
        ...
        DbContexts.Default.RegisterContext<DR_V_RegistrationReport, DrugRegisterContainer>();
    }
}


======================================

ЗЫ
Извиняюсь если не совсем корректно задан вопрос или оформлено криво.
c# ef dbcontext
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.