Entity Framework Core (6.0.8) indirect Many to Many relationship with 2 db contexts

Viewed 31

I am unable to generate a migration for a many to many relationship that spans 2 different db contexts. I have 3 entities: AccountApp, SubscriptionDetail, and SubscribedAccountApp. AccountApp and SubscribedAccountApp are the AccountDbContext while the SubscriptionDetail is in a SubscriptionsDbContext. I want to set up an indirect many to many relationship as described here

Based on the documentation, I have created an EntityTypeConfig for the SubscribedAccountApp like this

public class SubscribedAccountAppConfig : IEntityTypeConfiguration<SubscribedAccountApp>
    {
        public void Configure(EntityTypeBuilder<SubscribedAccountApp> builder)
        {
            builder.ToTable("subscribed_account_apps");

            builder.HasKey(m => new { m.SubscriptionDetailId, m.AccountAppId });

            builder.HasOne(x => x.SubscriptionDetail)
                .WithMany(x => x.SubscribedAccountApps)
                .HasForeignKey(x => x.SubscriptionDetailId);

            builder.HasOne(x => x.AccountApp)
                .WithMany(x => x.SubscribedAccountApps)
                .HasForeignKey(x => x.AccountAppId);
        }
    }

This config is then applied to the AccountDbContext like so

{
    public IQueryable<AccountApp> AccountApps { get; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.ApplyConfiguration(new AccountAppConfig());
        modelBuilder.ApplyConfiguration(new SubscribedAccountAppConfig());
    }
}

The data model for SubsriptionsDetails looks like:

public class SubscriptionDetail
{
    private readonly List<SubscribedAccountApp> _subscribedAccountApps;
    private readonly List<ConsumptionComponent> _consumptionComponents;

    public SubscriptionDetail(
        Guid id,
        IEnumerable<ConsumptionComponent> consumptionComponents = null,
        IEnumerable<SubscribedAccountApp> subscribedAccountApps = null)
    {
        Id = id;
        _consumptionComponents = consumptionComponents ?? new List<ConsumptionComponent>();
        _subscribedAccountApps = subscribedAccountApps ?? new List<SubscribedAccountApp>();
    }

    public Guid Id { get; set; }
    public IReadOnlyCollection<ConsumptionComponent> ConsumptionComponents => _consumptionComponents;
    public IReadOnlyCollection<SubscribedAccountApp> SubscribedAccountApps => _subscribedAccountApps;
}

The data model for AccountApp looks like:

    public class AccountApp
    {
        public readonly List<SubscribedAccountApp> _subscribedAccountApps;

        public AccountApp(Guid id,
            Guid accountId,
            IEnumerable<SubscribedAccountApp> subscribedAccountApps = null)
        {
            Id = id;
            _subscribedAccountApps = subscribedAccountApps.ToNavigationProperty();
        }

        public Guid Id { get; private set; }

        public IReadOnlyCollection<SubscribedAccountApp> SubscribedAccountApps => _subscribedAccountApps;
    }

This leaves me an error when I try to create a migration for the AccountDbContext: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.InvalidOperationException: No suitable constructor was found for entity type 'ConsumptionComponent'.. This error describes a ConsumptionComponent constructor for some reason, although this model has already existed and nothing has changed on that model. This model does appear as an IEnumberable in the SubscriptionDetail constructor but I am not sure why it is showing up as an error. All I want this migration to do is add support for the indirect-many-to-many-relationship which has nothing to do with ConsumptionComponent.

0 Answers
Related