实体框架核心:需要一对一关系

时间:2020-04-26 17:14:48

标签: asp.net-core entity-framework-core ef-fluent-api

实体:AddressMarket

public class Address
{
    ...

    // Navigation properties
    public Guid MarketId { get; set; }
    public Market Market { get; set; }
}

public class Market
{
    ...

    // Navigation properties
    public Guid AddressId { get; set; }
    public Address Address { get; set; }
}

相关规则:

  1. 每个Market都有一个Address,而没有Market的{​​{1}}就不存在。 Address是必需的
  2. 用户无法删除属于Address的{​​{1}}
  3. 用户删除Address时,其Market必须自动删除

是否可以使用Entity Framework Core和Fluent API配置以上关系?

我已经了解了与EF Core的一对一关系,并且了解到我需要说出哪个实体是主体,哪个实体是从属。而且我必须使用Fluent API来做到这一点。

我尝试了两种方法:

  1. 以市场为主体:采用这种方法,只有规则3有效。我可以添加不带Market的{​​{1}}(违反规则1)。需要现有的Address来添加Market。然后用户可以删除属于Address的{​​{1}}(违反规则2)。
Market
  1. Address作为主体:通过这种方法,只有规则3被打破。用户不能在没有Address的情况下添加Market,换句话说,需要现有的builder.Entity<Market>() .HasOne<Address>(m => m.Address) .WithOne(a => a.Market) .HasForeignKey<Address>(a => a.MarketId) .OnDelete(DeleteBehavior.Cascade); 来添加Address。用户无法删除属于Market的{​​{1}},因为在DeleteBehavior上,该关系被设置为Restrict。但是,如果用户删除Address,则其Address不会自动删除。 API必须对此进行处理。
Market

我不确定是否正确设置了关系,或者仅仅是EF Core的限制。有帮助吗?

1 个答案:

答案 0 :(得分:0)

Fluent API应该无法满足您当前的需求,因为您的需求是正常需求的contrary

根据常规逻辑,Address是主表,它不附加到Market表,因此,当删除Market表数据时,不应影响{ {1}}表。

但是,如果必须删除,则还有另外两种选择。

第一个是直接删除相应的数据Address,您可以根据当前删除的市场数据的外键in the code logic after you delete the Market's data获取地址数据,然后将其删除。

第二,您可以在数据库中创建AddressId,以确保在删除市场数据时,相应的地址数据也被删除,逻辑与第一个相同。