简体   繁体   中英

Entity Framework pick DBContext

I have a .NET 6 project using EF Core 6 and Azure SQL, with two DbContext s, one for each region that we operate in (EU, UK).

I want to be able to pick the DbContext for the region at time or running.

Here what I have, it's working, but it's cumbersome,

if (loc == "UK")
{
    ContextUK db = new ContextUK();

    var subs = db.Subscriptions.Where(s => s.Status == "Active" )
                               .Select(s => s.Id);

    return db.Addons.Where(s => subs
                            .Contains(s.Id))
                            .ToList();
   }
   else
   {
      Context db = new Context();

      var subs = db.Subscriptions.Where(s => s.Status == "Active")
                                 .Select(s => s.Id);

      return db.Addons.Where(s => subs
                              .Contains(s.Id))
                              .ToList();
   }

I've tried this

var db = loc == "UK" ? new ContextUK() : new Context();

But I get an implicit conversion error, any ideas?

using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using Poller.Models;

namespace Poller
{
    public partial class Context : DbContext
    {
        public Context()
        {
        }

        public Context(DbContextOptions<Context> options)
            : base(options)
        {
        }
        public virtual DbSet<Reseller> Resellers { get; set; } = null!;

        public virtual DbSet<dBCustomers> Customers { get; set; } = null!;

        public virtual DbSet<dBProduct> Products { get; set; } = null!;

        public virtual DbSet<dBSubscription> Subscriptions { get; set; } = null!;

        public virtual DbSet<dBAddons> Addons { get; set; } = null!;

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                
                SqlConnectionStringBuilder builder = new()
                {
                    ////
                };

                optionsBuilder
                .UseSqlServer(builder.ConnectionString);
            }
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {

            modelBuilder.Entity<dBCustomer>(entity =>
            {
                entity.HasKey(e => e.CustomerId)
                    .HasName("PK_Customers_CustomerId");

                entity.Property(e => e.CustomerId).HasMaxLength(64);

                entity.Property(e => e.CustomerName).HasMaxLength(512);

            });

            modelBuilder.Entity<dBSubscription>(entity =>
            {
                entity.ToTable(tb => tb.IsTemporal(ttb =>
                {
                    ttb.UseHistoryTable("subscriptions", "His");
                    ttb
                        .HasPeriodStart("SysStartTime")
                        .HasColumnName("SysStartTime");
                    ttb
                        .HasPeriodEnd("SysEndTime")
                        .HasColumnName("SysEndTime");
                }));
                
                entity.HasIndex(e => e.CustomerId, "nci_wi_Subscriptions_1A4A4BFC7994C478D5C6262FFAD2CF90");

                entity.HasIndex(e => e.Reseller, "nci_wi_Subscriptions_AFF865B2B84F59CEDC317D93B1DAE852");

                entity.Property(e => e.Id).HasMaxLength(64);

                entity.Property(e => e.CommitmentEndDate).HasColumnType("date");

                entity.Property(e => e.EffectiveStartDate).HasColumnType("date");

                entity.Property(e => e.OfferId).HasMaxLength(64);

                entity.Property(e => e.OfferName).HasMaxLength(256);

                entity.Property(e => e.ProductType).HasMaxLength(16);

                entity.Property(e => e.Reseller)
                    .HasMaxLength(16)
                    .HasColumnName("Reseller");

                entity.Property(e => e.Status).HasMaxLength(16);

                entity.Property(e => e.CustomerId).HasMaxLength(64);

                entity.Property(e => e.TermDuration)
                    .HasMaxLength(16)
                    .HasColumnName("termDuration");

                entity.HasOne(d => d.Customer)
                    .WithMany(p => p.Subscriptions)
                    .HasForeignKey(d => d.CustomerId)
                    .HasConstraintName("FK_Customers_CustomerId");
            });

            modelBuilder.Entity<dBProduct>(entity =>
            {
                entity.HasNoKey();

                entity.Property(e => e.Title).HasMaxLength(512);

                entity.Property(e => e.Term).HasMaxLength(512);

                entity.Property(e => e.Billing).HasMaxLength(512);

                entity.Property(e => e.Type).HasMaxLength(512);
            });

            modelBuilder.Entity<Reseller>(entity =>
            {
                entity.HasKey(e => e.Reseller)
                    .HasName("PK__Reseller__054B69376F9BA262");

                entity.Property(e => e.Reseller)
                    .HasMaxLength(32)
                    .HasColumnName("Reseller");

                entity.Property(e => e.ResellerName).HasMaxLength(512);
            });

            modelBuilder.Entity<dBaddons>(entity =>
            {
                entity.HasKey(e => e.addonsId)
                    .HasName("PK__addons__411A3D16E3765B5F");

                entity.Property(e => e.addonsId).HasMaxLength(64);

                entity.Property(e => e.Id).HasMaxLength(64);

                entity.Property(e => e.Status).HasMaxLength(16);

                entity.Property(e => e.CustomerId).HasMaxLength(64);

                entity.HasOne(d => d.Customer)
                    .WithMany(p => p.addonss)
                    .HasForeignKey(d => d.CustomerId)
                    .OnDelete(DeleteBehavior.ClientSetNull)
                    .HasConstraintName("FK__addons__cust__2759D01A");
            });
        }
    }
}

I solved this by creating an interface and then adding it to both dbcontexts,

Interface:

public interface IDatabaseContext
{
    DbSet<Reseller> Resellers { get; set; }

    DbSet<dBCustomers> Customers { get; set; }

    DbSet<dBProduct> Products { get; set; }

    DbSet<dBSubscription> Subscriptions { get; set; }

    DbSet<dBAddons> Addons { get; set; }
}

DBContext:

public partial class Context : DbContext, IDatabaseContext

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM