Несколько экземпляров одного класса DBContext во время выполнения с различными DBContextOptions с различными реализациямC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Несколько экземпляров одного класса DBContext во время выполнения с различными DBContextOptions с различными реализациям

Сообщение Anonymous »

У меня есть приложение 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»