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

问题描述 投票:1回答:1

实体: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就不能存在AddressAddress为必填项
  2. 用户无法删除属于AddressMarket
  3. 用户删除Market时,必须自动删除其Address

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

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

我尝试了两种方法:

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

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

asp.net-core entity-framework-core ef-fluent-api
1个回答
0
投票

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.