Добрый день!
Сразу скажу, я недавно в 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>();
}
}
======================================
ЗЫ
Извиняюсь если не совсем корректно задан вопрос или оформлено криво.