一对一可选的自引用关系

时间:2019-02-02 12:21:05

标签: 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; }
}

这意味着,每笔交易都是客户对客户交易或CommssionFee交易(客户对客户交易之间的交易佣金),它在TransactionType属性中描述,这是枚举类型。

示例:鲍勃向爱丽丝转移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.???);

1 个答案:

答案 0 :(得分:3)

写您流利API配置如下:

builder.HasOne(tr => tr.CommissionTransactionForRealTransaction)
       .WithOne().HasForeignKey<Transaction>(tr => tr.CommissionTransactionForRealTransactionId)
       .IsRequired(false);

它应该为您工作。