У меня есть приложение ASP.net Core, где пользователю разрешается добавлять несколько баз данных (скажем, ID и ConnectionString) во время выполнения. Затем приложение будет создавать и кэшировать настроенный dbcontextoptions и будет использовать его для создания DBContext (Options) для этого идентификатора (определяется из претензии) при запросе. Эти базы данных имеют по сути такую же структуру, помимо возможности пользователя добавлять к ним пользовательские поля, и это обрабатывается путем создания свойств тени во время dbcontext (). OnmodelCreating () в объекте ientityTypeConfiguration.configure () .
public class UdfDefinition {
public Type fieldType { get; set; }
public string fieldName { get; set; }
}
public partial class MyEntity {
}
public partial class MyEntityConfiguration : IEntityTypeConfiguration {
public MyEntityConfiguration(List udfDefinitions) {
this.udfDefinitions = udfDefinitions;
}
private List udfDefinitions { get; }
public void Configure(EntityTypeBuilder entity) {
// Add UDF shadow properties
foreach (var udfDefinition in udfDefinitions) {
entity.Property(udfDefinition.fieldType, udfDefinition.fieldName);
}
}
}
public class MyDBContext : DbContext {
public MyDBContext(DbContextOptions options, List udfDefinitions) {
this.udfDefinitions = udfDefinitions;
}
private List udfDefinitions { get; }
public virtual DbSet myEntities { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder) { // o.dbID == dbID).dbContextOptions as DbContextOptions,
dBOptionsCaches.First(o => o.dbID == dbID).udfDefinitions
);
}
public void TestShadowPropeties() {
var myDBContext1 = MyDBContextForID(1);
var myEntity1 = myDBContext1.myEntities.First(); // Correct data from db1
var test1 = myDBContext1.Entry(myEntity1).Property("int1").CurrentValue; // Good
var myDBContext2 = MyDBContextForID(2);
var myEntity2 = myDBContext2.myEntities.First(); // Correct data from db2
var test2 = myDBContext2.Entry(myEntity2).Property("string1").CurrentValue; // Error - property "string1" not found
}
}
Проблема заключается в том, что EF Core, кажется, кэширует конфигурацию для класса MyDbContext и не распознает новый экземпляр с уникальным DBContextOptions (то есть ConnectionString), как отличающееся, как и MyDbContext.OnModelCreating (). Признайте, что другой экземпляр mydbcontext отличается и заставляет ее снова создать конфигурацию (то есть дифференцировать их от dbcontextoptions , а не по типу класса DBContext)? И использовать соответствующую кэшированную конфигурацию для этих вариантов в будущем.
Подробнее здесь: https://stackoverflow.com/questions/795 ... bcontextop
Несколько экземпляров одного класса DBContext во время выполнения с различными DBContextOptions с различными реализациям ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Подключение декоратора базовой реализации к производным реализациям с помощью Autofac
Anonymous » » в форуме C# - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-