定義關聯屬性來使用倉儲WithDetailsAsync
方法取得關聯資料
預設載入關聯實體
EntityFrameworkCoreModule
Configure<AbpEntityOptions>(options =>
{
options.Entity<Blog>(orderOptions =>
{
orderOptions.DefaultWithDetailsFunc =
query => query.Include(o => o.Posts);
});
});
BlogAppService
var q = await _blogRepository.WithDetailsAsync();
var entity = await AsyncExecuter.FirstAsync(q);
這樣使用時就不用再指定 WithDetailsAsync(x => x.Posts)
var entity = await _blogRepository.GetAsync();
使用 GetAsync
時會直接包含Posts
Entity Framework Core | Documentation Center | ABP.IO
步驟
首先要在 Entity 定義導覽屬性
- Order
public ICollection<OrderLine> Lines { get; set; } //Sub collection
- OrderLine
[JsonIgnore] public Order Order { get; set; } //Navigation property
注意
- 如果沒加
[JsonIgnore]
(System.Text.Json.Serialization) ,API 回傳的時候會報錯 [JsonIgnore]
是using System.Text.Json.Serialization;
而非using Newtonsoft.Json;
否則會吃不到設定
JsonException: A possible object cycle was detected.
This can either be due to a cycle or if the object depth
is larger than the maximum allowed depth of 32.
如果FK不符合命名原則 (OrderId
),則需要在 DbContext 定義關聯
//Define the relation
b.HasMany(x => x.Lines)
.WithOne(x => x.Order)
.HasForeignKey(x => x.NotOrderIdButIsFkId)
.IsRequired();
最後就可以透過倉儲取得
//Get a IQueryable<T> by including sub collections
var queryable = await _orderRepository.WithDetailsAsync(x => x.Lines);
//Apply additional LINQ extension methods
var query = queryable.Where(x => x.Id == id);
//Execute the query and get the result
var order = await AsyncExecuter.FirstOrDefaultAsync(query);
沒意外了話,order 裡面會包含 Line 的集合資料
[Fact]
public async Task Should_Get_Details_From_A_Order()
{
var orderManager = GetRequiredService<orderManager>();
//Act
var result = await WithUnitOfWorkAsync(async () =>
await orderManager.WithDetailsAsync()};
//Assert
result.ShouldNotBeNull();
result.Lines.ShouldNotBeNull();
result.Lines.Count.ShouldBeGreaterThan(0);
}
多層關聯 [Include(A).ThenInclude(B)]
//Get a IQueryable<T> by including sub collections
var queryable = await _orderRepository.WithDetailsAsync(
x => x.Lines,
x => x.Lines.Providers);
//Apply additional LINQ extension methods
var query = queryable.Where(x => x.Id == id);
//Execute the query and get the result
var result = await AsyncExecuter.ToListAsync(query, cancellationToken);
複數關聯 [Include(A).Include(C)]
//Get a IQueryable<T> by including sub collections
var queryable = await _orderRepository.WithDetailsAsync(
x => x.Lines,
x => x.Details);
//Apply additional LINQ extension methods
var query = queryable.Where(x => x.Id == id);
//Execute the query and get the result
var result = await AsyncExecuter.ToListAsync(query, cancellationToken);
參照
Entity Framework Core | Documentation Center | ABP.IO
認識 Entity Framework Core 載入關聯資料的三種方法 | The Will Will Web (miniasp.com)