EF核心:一对一,一对多

本文关键字:一对多 一对一 核心 EF | 更新日期: 2023-09-27 17:57:32

在我的模型中,一个帐户有很多订阅,但只有一个订阅是活动的。

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

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

然后用某个id创建新帐户(例如5)。此外,"非活动"订阅自动具有accountId 5,"活动"订阅具有activeInAccountForeignKey 5和accountId 0。我希望活动订阅accountId也将自动为5。

我如何才能做到这一点(或者:我的模型应该看起来怎么样)?

谢谢!

EF核心:一对一,一对多

我认为以下情况是不可能的:Subscription对象的父对象AccountActiveInAccount不同。

如果是这种情况(希望是这样),那么您可以在Subscription中去掉ActiveInAccountActiveInAccountForeignKey,在Account中去掉ActiveSubscription。对于活动订阅,您可以简单地在Subscription中使用bool IsActive来表示活动订阅。基于此,您可以重新设计实体模型。

除此之外,你还必须思考你的实体是如何关联的,例如是一对一、一对多还是多对多。根据我的经验,我从未见过两个实体以一种以上的关系相互关联,这是有充分理由的。也许一个好的起点是从一个简单的类图开始,并决定这些类之间的基数/关系。从那里开始编写实体模型。

希望能有所帮助。

你是本末倒置。创建模型时不考虑"它在web api中会是什么样子?"只需创建模型。

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