[英]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”實體的屬性,因此在這種情況下,它將是沒有Tags
或Improvements
的Attachments
。 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.