Ядро EF: один к одному с одним ко многим

В моей модели для одной учетной записи много подписок, но активна только одна подписка.

Итак, я попробовал модель так:

public virtual DbSet<Account> Accounts { get; set; }
public virtual DbSet<Subscription> Subscriptions { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Account>()
            .HasOne(p => p.ActiveSubscription)
            .WithOne(i => i.ActiveInAccount)
            .HasForeignKey<Subscription>(b => b.ActiveInAccountForeignKey);

        modelBuilder.Entity<Account>()
            .HasMany(p => p.Subscriptions)
            .WithOne(i => i.Account)
            .HasForeignKey(b => b.AccountId);
     }

 public class Account
{
    public int AccountId { get; set; }
    public string Name { get; set; }
    public List<Subscription> Subscriptions { get; set; }
    public Subscription ActiveSubscription { get; set; }
}

public class Subscription
{
    public int SubscriptionId { get; set; }
    public string Name { get; set; }
    public Account Account { get; set; }
    public int AccountId { get; set; }

    public int? ActiveInAccountForeignKey { get; set; }
    public Account ActiveInAccount { get; set; }
}

Теперь я попытался разместить новую учетную запись с активной подпиской и неактивной подпиской. если я отправлю этот JSON:

{
  "accountId": 0,
  "subscriptions": [
    {
      "subscriptionId": 0,
      "name": "nonActive",
      "accountId": 0,
      "activeInAccountForeignKey": null
    }
  ],
  "activeSubscription": {
      "subscriptionId": 0,
      "name": "active",
      "accountId": 0,
      "activeInAccountForeignKey": 0
  }
}

Затем создается новая учетная запись с некоторым идентификатором (например, 5). Дополнительно - автоматически "неактивная" подписка имеет accountId 5 и "активная" подписка имеет activeInAccountForeignKey 5 и accountId 0. Я хочу эту активную подписку accountId также будет 5 автоматически.

Как мне этого добиться (или: как должна выглядеть моя модель)?

Спасибо!

2 ответа

Я предполагаю, что следующий сценарий невозможен: Subscription родитель объекта Account отличается от ActiveInAccount,

Если это так (и, надеюсь, так), то вы можете избавиться от ActiveInAccount, а также ActiveInAccountForeignKey в Subscription, а также ActiveSubscription в Account, Для активной подписки вы можете просто использовать bool IsActive в Subscription, для обозначения активной подписки. И на основании этого вы можете изменить дизайн вашей модели сущности.

Помимо этого, вы также должны подумать о том, как связаны ваши сущности, например, один к одному, один ко многим или многие ко многим. По своему опыту, я никогда не видел двух сущностей, которые связаны друг с другом более чем одной связью, по любой уважительной причине. Возможно, хорошей отправной точкой было бы начать с простой диаграммы классов и определить количество элементов / отношения между этими классами. И оттуда начните писать свою модель сущности.

Надеюсь, поможет.

Вы кладете телегу перед лошадью. Создать модель без рассмотрения "как бы это выглядело в web api?" Просто создайте модель.

При создании модели вы можете попытаться использовать автоматически сгенерированный WebAPI, ODATA или другой API. Если вам нужно что-то особенное, то вам нужно вручную преобразовать классы модели в свои пользовательские структуры.

Другие вопросы по тегам