实体:Address
和Market
:
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; }
}
相关规则:
Market
都有一个Address
,没有Market
就不能存在Address
。 Address
为必填项Address
的Market
Market
时,必须自动删除其Address
是否可以使用Entity Framework Core和Fluent API配置以上关系?
我已经阅读了与EF Core的一对一关系,并且了解到我需要说哪个实体是主体,哪个实体是从属。而且我必须使用Fluent API来做到这一点。
我尝试了两种方法:
Market
的Address
(违反规则1)。需要现有的Market
来添加Address
。并且用户可以删除属于Address
的Market
(违反规则2)。builder.Entity<Market>()
.HasOne<Address>(m => m.Address)
.WithOne(a => a.Market)
.HasForeignKey<Address>(a => a.MarketId)
.OnDelete(DeleteBehavior.Cascade);
Address
作为原则:使用这种方法,只有规则3被破坏。用户不能在没有Market
的情况下添加Address
,换句话说,需要现有的Address
来添加Market
。用户无法删除属于Address
的Market
,因为在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限制。有帮助吗?
Fluent API应该无法满足您当前的需求,因为您的需求是正常需求的contrary
。
根据正常逻辑,Address
是主表,它不附加到Market
表,因此,当删除Market
表数据时,不应影响Address
表。
但是,如果必须删除,则还有另外两种选择。
第一个是直接删除相应数据in the code logic after you delete the Market's data
,您可以根据当前删除的市场数据的外键AddressId
获取地址数据,然后将其删除。
第二,您可以在数据库中创建一个trigger
以确保在删除市场数据时,相应的地址数据也被删除,逻辑与第一个相同。