Ядро 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. Если вам нужно что-то особенное, то вам нужно вручную преобразовать классы модели в свои пользовательские структуры.