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。
我如何才能做到这一点(或者:我的模型应该看起来怎么样)?
谢谢!
我认为以下情况是不可能的:Subscription
对象的父对象Account
与ActiveInAccount
不同。
如果是这种情况(希望是这样),那么您可以在Subscription
中去掉ActiveInAccount
和ActiveInAccountForeignKey
,在Account
中去掉ActiveSubscription
。对于活动订阅,您可以简单地在Subscription
中使用bool IsActive
来表示活动订阅。基于此,您可以重新设计实体模型。
除此之外,你还必须思考你的实体是如何关联的,例如是一对一、一对多还是多对多。根据我的经验,我从未见过两个实体以一种以上的关系相互关联,这是有充分理由的。也许一个好的起点是从一个简单的类图开始,并决定这些类之间的基数/关系。从那里开始编写实体模型。
希望能有所帮助。
你是本末倒置。创建模型时不考虑"它在web api中会是什么样子?"只需创建模型。
创建模型时,您可以尝试使用自动生成的WebAPI、ODATA或其他API。如果您需要一些特殊的东西,那么您需要手动将模型类转换为自定义结构。