EF核心:一对一,一对多

时间:2016-07-17 15:38:32

标签: c# .net entity-framework entity-framework-core

在我的模型中,一个帐户有多个订阅,但只有一个订阅处于活动状态。

所以,我尝试了这样的模型:

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; }
}

现在我尝试使用activeSubscription和非活动订阅发布新帐户。如果我发布这个json:

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

然后使用一些id创建新帐户(例如5)。 另外 - 自动&#34; nonActive&#34;订阅有accountId 5和&#34;有效&#34;订阅有activeInAccountForeignKey 5和accountId 0。 我希望有效订阅accountId也将自动为5。

我如何实现这一目标(或者:应该如何看待我的模型)?

谢谢!

2 个答案:

答案 0 :(得分:1)

我假设无法使用以下方案:Subscription对象的父级AccountActiveInAccount不同。

如果是这种情况(希望如此)那么你可以摆脱ActiveInAccount中的ActiveInAccountForeignKeySubscription以及{{1}中的ActiveSubscription }}。对于有效订阅,您只需在Account中使用bool IsActive即可表示有效订阅。在此基础上,您可以重新设计实体模型。

除此之外,您还必须考虑您的实体是如何相关的,例如,它是一对一,一对多还是多对多。根据我的经验,出于任何好的理由,我从未见过两个有多个关系的实体。也许一个好的起点是从一个简单的类图开始,并决定这些类之间的基数/关系。从那里开始编写实体模型。

希望它有所帮助。

答案 1 :(得分:0)

你把马车放在马前。创建模型时不考虑“它在web api中的外观如何?”只需创建模型。

创建模型时,您可以尝试使用自动生成的WebAPI,ODATA或其他API。如果您需要特殊的东西 - 那么您需要手动将模型类转换为自定义结构。