簡體   English   中英

Entity Framework Core 與表的多重關系

[英]Entity Framework Core multiple relations to a table

使用Entity Framework Core 7.0.2 in ASP.NET Core Web API 編寫於C#。

我有多個表,它們都以一對多關系連接。

查看下面的樹是如何連接所有表的。

樹

我剛剛添加了 2 個與交易相關的額外表格。

這是我的模態的樣子:

public class Trade
{
    [Required][Column(TypeName = "varchar(50)")] public string Id { get; set; }
    [Required][Column(TypeName = "varchar(50)")] public string TradingJournalId { get; set; }
    public ICollection<Attachment> Attachments { get; set; }
    public ICollection<Improvement> Improvements { get; set; }
    public ICollection<Tag> Tags { get; set; }
}

在我添加其他 2 個名為 Improvements 和 Tags 的表之前,我收集具有關系的用戶的查詢如下:

var user = _context.Users
    .Include(u => u.TradingJournal)
    .ThenInclude(t => t.Trades)
    .ThenInclude(f => f.Attachments)
    .SingleOrDefault(u => u.Id == Id);

如果我嘗試以下操作,它將導致錯誤,因為將查看附件表。

var user = _context.Users
    .Include(u => u.TradingJournal)
    .ThenInclude(t => t.Trades)
    .ThenInclude(f => f.Attachments)
    .ThenInclude(f => f.Tags)
    .ThenInclude(f => f.Improvements)
    .SingleOrDefault(u => u.Id == Id);

這是我的首選 output。

{
    "Id": "114af6db-0124-4573-9ab9-d676f8c05a48",
    "TradingJournal": [
        {
            "Id": "fa0eef8c-16fd-416e-97ec-df6f43c448f2",
            "UserId": "114af6db-0124-4573-9ab9-d676f8c05a48",
            "Trades": [
                {
                    "Id": "4e7ebfd4-54dc-48c7-9e23-01312295f431",
                    "TradingJournalId": "fa0eef8c-16fd-416e-97ec-df6f43c448f2",
                    "Attachments": [
                        {
                            "Id": "362be948-8bc3-4172-ad19-9625bb5aebf4",
                            "TradeId": "4e7ebfd4-54dc-48c7-9e23-01312295f431",
                        }
                    ],
                    "Tags": [
                        {
                            "Id": "362be948-8bc3-4172-ad19-96252b54ebf2",
                            "TradeId": "4e7ebfd4-54dc-48c7-9e23-01312295f431",
                        }
                    ],
                    "Improvements": [
                        {
                            "Id": "362be948-8bc3-4172-ad19-9625bb5ae3f8",
                            "TradeId": "4e7ebfd4-54dc-48c7-9e23-01312295f431",
                        }
                    ],
                }
            ]
        }
    ]
}

目前標簽和改進都是 null。

我不知道如何通過添加對其他 2 個表的引用來解決這個問題。 我做了一些研究如何去做,但由於多重關系,我的情況要復雜得多,因此我需要幫助。

編輯:

這是所有實體模態。

public class User
{
    [Required][StringLength(50)][Column(TypeName = "varchar(50)")] public string Id { get; set; }
    public ICollection<TradingJournal> TradingJournal { get; set; }
}

public class TradingJournal
{
    [Required][Column(TypeName = "varchar(50)")] public string Id { get; set; }
    [Required][Column(TypeName = "varchar(50)")] public string UserId { get; set; }
    public ICollection<Trade> Trades { get; set; }
}

public class Trade
{
    [Required][Column(TypeName = "varchar(50)")] public string Id { get; set; }
    [Required][Column(TypeName = "varchar(50)")] public string TradingJournalId { get; set; }
    public ICollection<Attachment> Attachments { get; set; }
    public ICollection<Improvement> Improvements { get; set; }
    public ICollection<Tag> Tags { get; set; }
}

public class Attachment
{
    [Required][StringLength(50)][Column(TypeName = "varchar(50)")] public string Id { get; set; }
    [Required][StringLength(50)][Column(TypeName = "varchar(50)")] public string TradeId { get; set; }
}

public class Improvement
{
    [Required][StringLength(50)][Column(TypeName = "varchar(50)")] public string Id { get; set; }
    [Required][StringLength(50)][Column(TypeName = "varchar(50)")] public string TradeId { get; set; }
}

public class Tags
{
    [Required][StringLength(50)][Column(TypeName = "varchar(50)")] public string Id { get; set; }
    [Required][StringLength(50)][Column(TypeName = "varchar(50)")] public string TradeId { get; set; }
}

我已經刪除了模態中所有引用表不需要的不相關屬性,以便這段代碼更具可讀性。

ThenInclude允許包含“previous”實體的屬性,因此在這種情況下,它將是沒有TagsImprovementsAttachments AFAIK EF Core 仍然不允許“后退”,因此請嘗試以下操作:

var user = _context.Users
    .Include(u => u.TradingJournal)
        .ThenInclude(t => t.Trades)
            .ThenInclude(f => f.Attachments)
    .Include(u => u.TradingJournal)
        .ThenInclude(t => t.Trades)
            .ThenInclude(f => f.Tags)
    .Include(u => u.TradingJournal)
        .ThenInclude(t => t.Trades)
            .ThenInclude(f => f.Improvements)
    .SingleOrDefault(u => u.Id == Id);

查看預加載文檔的包含多個級別部分

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM