一对一可选的自引用关系

Isk*_*yev 4 c# entity-framework-core

我面临以下领域模型

public class Transaction
{
    public Guid Id { get; set; }
    public decimal TransactionSum { get; set; }
    public decimal TransactionCurrencyConversionRatio { get; set; }
    public bool IsTransactionApprovedBySystem { get; set; }
    public bool IsTransactionApprovedBySender { get; set; }
    public DateTime TransactionInitiatedDate { get; set; }
    public DateTime ? TransactionApprovedDate { get; set; }
    public TransactionType TransactionType { get; set; }

    public Account SenderAccount { get; set; }
    public Account ReceiverAccount { get; set; }
    public Guid SenderAccountId { get; set; }
    public Guid ReceiverAccountId { get; set; }
    public Transaction CommissionTransactionForRealTransaction { get; set; }
    public Guid ? CommissionTransactionForRealTransactionId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

这意味着,每笔交易都是 Client-to-Client 交易 OR CommssionFee 交易(委托给 Client-to-Client 交易之间的交易),它在 TransactionType 属性中描述,它是枚举类型。

示例:Bob 向 Alice 转账 100 美元,系统为此转账服务收取 1 美元,因此为该操作添加了 2 行:

交易 #XXX1 - 100$ 并且它的类型为 Client-To-Client 并且属性 CommissionTransactionForRealTransaction 为 NULL,因此表中的 CommissionTransactionForRealTransactionId 属性设置为 NULL。

交易 #XXX2 - 1$ 并且它的类型为 CommissionFee,并且属性 CommissionTransactionForRealTransaction 正在引用另一个对象,而表中的 CommissionTransactionForRealTransactionId 有一些外键。

我在 EF Core 关系部分阅读了 MSDN 中的文档和示例,但不知道如何实现 0...1 到 1 自引用。我从这个代码开始:

builder.HasOne(p => p.CommissionTransactionForRealTransaction)
    .WithOne(p => p.???);
Run Code Online (Sandbox Code Playgroud)

Tan*_*jel 11

编写流畅的 API 配置如下:

builder.HasOne(tr => tr.CommissionTransactionForRealTransaction)
       .WithOne().HasForeignKey<Transaction>(tr => tr.CommissionTransactionForRealTransactionId)
       .IsRequired(false);
Run Code Online (Sandbox Code Playgroud)

它应该适合你。

  • (1) *“按照如下方式编写流畅的 API 配置”* **为什么?** (2) *“它应该适合你”* **应该**还是**会**? (2认同)
  • 那么“应该”或“将”之间有什么区别,他们都在证明答案是提问者想要的。 (2认同)
  • @IvanStoev 亲爱的,你让事情变得复杂了!“它应该有效”意味着它在我这边有效,如果没有外部代理人在这里施加影响,它也会对你有效。请放轻松。顺便说一句,我喜欢你的方法。 (2认同)
  • 嘿@Tanvir,如您所见,我只是发表评论以帮助您改进答案。否则我可以简单地使用 DV 而不需要任何解释 :) (2认同)
  • @IvanStoev `如果一个人的 FK 不遵循约定,他们必须使用正确的 API 对其进行映射。` 是的!这就是我这样做的原因,因为将来可能有人会不遵守约定来回答这个问题。谢谢大家的交谈。 (2认同)
  • 映射 FK 不是这个问题/问题的一部分,所以有*那个*问题的人不太可能来*这个*问题/答案。无论如何,您正在改进 - 至少这次您没有更改 OP 模型:) 谁知道呢,下次您可能不会包含多余的东西:) 干杯。 (2认同)