Saya mendapatkan kesalahan berikut. Saat ini mengikuti pola Async/menunggu Dan menggunakan IServiceScopeFactory. Mencoba menautkan Repo dengan IQueryable.

Menerima Kesalahan di bawah ini:

Tidak dapat mengakses objek yang dibuang. Penyebab umum kesalahan ini adalah membuang konteks yang diselesaikan dari injeksi ketergantungan dan kemudian mencoba menggunakan instance konteks yang sama di tempat lain dalam aplikasi Anda. Ini dapat terjadi jika Anda memanggil Dispose() pada konteks, atau membungkus konteks dalam pernyataan using. Jika Anda menggunakan injeksi ketergantungan, Anda harus membiarkan wadah injeksi ketergantungan menangani pembuangan instance konteks. Nama objek: 'PropertyContext'.

Repositori:

public class AddressRepository
{
    private readonly IServiceScopeFactory _factory;
    public AddressRepository(IServiceScopeFactory factory) : base(factory)
    {
        _factory = factory;

    [EnableQuery]
    public IQueryable<LkAddressType> GetAddressTypes()
    {
        using (var scope = _factory.CreateScope())
        {
            var db = scope.ServiceProvider.GetService<PropertyContext>();
            return db.LkAddressType.AsNoTracking();
        }
    }

Layanan Aplikasi:

    public async Task<AddressTypeResponse> GetAddressTypes()
    {
        var data = await (_addressRepository.GetAddressTypes()).ToListAsync();
        var mapped = _mapper.Map<ICollection<AddressTypeModel>>(data);
        var dto = _mapper.Map<ICollection<AddressTypeDto>>(mapped);
        return new AddressTypeResponse {Body = dto};
    }

Pengontrol:

    [HttpGet("AddressType")]
    public async Task<ActionResult<AddressTypeResponse>> GetAddressTypes()
    {
         return Ok(await _service.GetAddressTypes());
    }

Saat ini menggunakan Net Core 2.2, Entity Framework Core, dan OData.

1
user13817218 30 Juni 2020, 21:53

1 menjawab

Jawaban Terbaik

Scope secara otomatis membuang objek scoped(dan transient) yang mengimplementasikan IDisosable yang dibuatnya, jadi ketika GetAddressTypes berakhir, scope dan db akan dibuang. Jadi, Anda perlu mengembalikan beberapa pembungkus yang akan dibuang oleh klien, atau mewujudkan kueri dan mengembalikan hasil dari metode:

[EnableQuery]
public Task<List<LkAddressType>> GetAddressTypes()
{
    using (var scope = _factory.CreateScope())
    {
        var db = scope.ServiceProvider.GetService<PropertyContext>();
        return await db.LkAddressType.AsNoTracking().ToListAsync();
    }
}

Atau masukkan konteks Anda langsung ke repositori dan biarkan kerangka kerja mengetahui cakupannya:

public class AddressRepository
{
    private readonly PropertyContext _ctx;
    public AddressRepository(PropertyContext ctx,IServiceScopeFactory factory) : base(factory)
    {
        _ctx= ctx;
     }

    [EnableQuery]
    public IQueryable<LkAddressType> GetAddressTypes()
    {
        return _ctx.LkAddressType.AsNoTracking();
    }
} 
0
Guru Stron 30 Juni 2020, 19:09