在我的模型中,一个帐户有多个订阅,但只有一个订阅处于活动状态。
所以,我尝试了这样的模型:
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。
我如何实现这一目标(或者:应该如何看待我的模型)?
谢谢!
答案 0 :(得分:1)
我假设无法使用以下方案:Subscription
对象的父级Account
与ActiveInAccount
不同。
如果是这种情况(希望如此)那么你可以摆脱ActiveInAccount
中的ActiveInAccountForeignKey
和Subscription
以及{{1}中的ActiveSubscription
}}。对于有效订阅,您只需在Account
中使用bool IsActive
即可表示有效订阅。在此基础上,您可以重新设计实体模型。
除此之外,您还必须考虑您的实体是如何相关的,例如,它是一对一,一对多还是多对多。根据我的经验,出于任何好的理由,我从未见过两个有多个关系的实体。也许一个好的起点是从一个简单的类图开始,并决定这些类之间的基数/关系。从那里开始编写实体模型。
希望它有所帮助。
答案 1 :(得分:0)
你把马车放在马前。创建模型时不考虑“它在web api中的外观如何?”只需创建模型。
创建模型时,您可以尝试使用自动生成的WebAPI,ODATA或其他API。如果您需要特殊的东西 - 那么您需要手动将模型类转换为自定义结构。