Как правильно создать свойство навигации для таблицы, определенной в другом контексте? ⇐ C#
-
Anonymous
Как правильно создать свойство навигации для таблицы, определенной в другом контексте?
Мне нужно создать свойство навигации для таблицы AspNetUser (Microsoft.AspNetCore.Identity.EntityFrameworkCore), но моя таблица определена в другом контексте. Оба контекста указывают на одну и ту же базу данных (но имеют разную схему).
Я уже нашел способ сделать это, когда у меня есть полный контроль над конфигурацией (пример ниже), но поскольку AspNetUser настраивается внутри IdentityDbContext, я не могу его использовать.
Вероятно, я мог бы декомпилировать IdentityDbContext и извлечь конфигурации таблиц, чтобы иметь возможность использовать их во втором контексте, но это кажется неправильным (и может сломаться при обновлении nuget)...
Есть идеи?
Ps: Причина, по которой второй контекст базы данных заключается в том, что я хотел бы иметь возможность вообще не регистрировать второй контекст
Мой текущий пример конфигурации CurrencyDbContext публичный запечатанный класс Валюта { внутренняя константная строка TableName = "Валюты"; общественный ИНТ Id {получить; набор; } } внутренний запечатанный класс CurrencyConfiguration: IEntityTypeConfiguration { частный readonly bool _IsExternal; public CurrencyConfiguration (bool isExternal) { _IsExternal = isExternal; } public void Configure(EntityTypeBuilder builder) { var table = builder.ToTable(Currency.TableName, CurrencyDbContext.Schema); если (_IsExternal) { table.Metadata.SetIsTableExcludedFromMigrations (истина); } builder.HasKey(o => o.Id); } } внутренний запечатанный класс CurrencyDbContext: DbContext { общественная константная строка Schema = «ядро»; public CurrencyDbContext(DbContextOptions options): base(options) { } public DbSet Валюты {get; набор; } = ноль!; защищенное переопределение void OnModelCreating (построитель ModelBuilder) { builder.ApplyConfiguration(new CurrencyConfiguration(false)); } } ItemDbContext Предмет общедоступного запечатанного класса { внутренняя константная строка TableName = «Элементы»; [Устарело("Не используйте этот конструктор. Используйте только для EF Core.", true)] внутренняя валюта() : this(null!) { } общественная валюта (валюта валюты) { Валюта = валюта; } общественный ИНТ Id {получить; набор; } общественная валюта Валюта {get; набор; } } внутренний запечатанный класс ItemConfiguration: IEntityTypeConfiguration { частный readonly bool _IsExternal; public ItemConfiguration (bool isExternal) { _IsExternal = isExternal; } public void Configure (EntityTypeBuilder builder) { var table = builder.ToTable(Item.TableName, ItemDbContext.Schema); если (_IsExternal) { table.Metadata.SetIsTableExcludedFromMigrations (истина); } builder.HasKey(o => o.Id); builder.Property(o => o.Id).UseIdentityColumn(); builder.HasOne(b => b.Currency).WithMany().OnDelete(DeleteBehavior.Restrict); } } внутренний запечатанный класс ItemDbContext: DbContext { общественная константная строка Schema = «элемент»; public ItemDbContext(DbContextOptions options): base(options) { } public DbSet Items {get; набор; } = ноль!; защищенное переопределение void OnModelCreating (построитель ModelBuilder) { builder.ApplyConfiguration(новый ItemConfiguration(false)); builder.ApplyConfiguration(new CurrencyConfiguration(true)); } }
Мне нужно создать свойство навигации для таблицы AspNetUser (Microsoft.AspNetCore.Identity.EntityFrameworkCore), но моя таблица определена в другом контексте. Оба контекста указывают на одну и ту же базу данных (но имеют разную схему).
Я уже нашел способ сделать это, когда у меня есть полный контроль над конфигурацией (пример ниже), но поскольку AspNetUser настраивается внутри IdentityDbContext, я не могу его использовать.
Вероятно, я мог бы декомпилировать IdentityDbContext и извлечь конфигурации таблиц, чтобы иметь возможность использовать их во втором контексте, но это кажется неправильным (и может сломаться при обновлении nuget)...
Есть идеи?
Ps: Причина, по которой второй контекст базы данных заключается в том, что я хотел бы иметь возможность вообще не регистрировать второй контекст
Мой текущий пример конфигурации CurrencyDbContext публичный запечатанный класс Валюта { внутренняя константная строка TableName = "Валюты"; общественный ИНТ Id {получить; набор; } } внутренний запечатанный класс CurrencyConfiguration: IEntityTypeConfiguration { частный readonly bool _IsExternal; public CurrencyConfiguration (bool isExternal) { _IsExternal = isExternal; } public void Configure(EntityTypeBuilder builder) { var table = builder.ToTable(Currency.TableName, CurrencyDbContext.Schema); если (_IsExternal) { table.Metadata.SetIsTableExcludedFromMigrations (истина); } builder.HasKey(o => o.Id); } } внутренний запечатанный класс CurrencyDbContext: DbContext { общественная константная строка Schema = «ядро»; public CurrencyDbContext(DbContextOptions options): base(options) { } public DbSet Валюты {get; набор; } = ноль!; защищенное переопределение void OnModelCreating (построитель ModelBuilder) { builder.ApplyConfiguration(new CurrencyConfiguration(false)); } } ItemDbContext Предмет общедоступного запечатанного класса { внутренняя константная строка TableName = «Элементы»; [Устарело("Не используйте этот конструктор. Используйте только для EF Core.", true)] внутренняя валюта() : this(null!) { } общественная валюта (валюта валюты) { Валюта = валюта; } общественный ИНТ Id {получить; набор; } общественная валюта Валюта {get; набор; } } внутренний запечатанный класс ItemConfiguration: IEntityTypeConfiguration { частный readonly bool _IsExternal; public ItemConfiguration (bool isExternal) { _IsExternal = isExternal; } public void Configure (EntityTypeBuilder builder) { var table = builder.ToTable(Item.TableName, ItemDbContext.Schema); если (_IsExternal) { table.Metadata.SetIsTableExcludedFromMigrations (истина); } builder.HasKey(o => o.Id); builder.Property(o => o.Id).UseIdentityColumn(); builder.HasOne(b => b.Currency).WithMany().OnDelete(DeleteBehavior.Restrict); } } внутренний запечатанный класс ItemDbContext: DbContext { общественная константная строка Schema = «элемент»; public ItemDbContext(DbContextOptions options): base(options) { } public DbSet Items {get; набор; } = ноль!; защищенное переопределение void OnModelCreating (построитель ModelBuilder) { builder.ApplyConfiguration(новый ItemConfiguration(false)); builder.ApplyConfiguration(new CurrencyConfiguration(true)); } }
Мобильная версия