Saya perlu mengekspos Entity Framework Data Context ke plugin pihak ketiga. Tujuannya adalah untuk memungkinkan plugin ini mengambil data saja dan tidak membiarkan mereka mengeluarkan penyisipan, pembaruan atau penghapusan atau perintah modifikasi database lainnya. Karenanya, bagaimana saya bisa membuat konteks atau entitas data hanya-baca.
112
DbContext
, beri mereka satuIQueryable
atau beberapa.Jawaban:
Selain menghubungkan dengan pengguna hanya-baca, ada beberapa hal lain yang dapat Anda lakukan untuk DbContext Anda.
sumber
AsNoTracking()
penggunaan pemuatan lambat tidak akan memungkinkan.public override Task<int> SaveChangesAsync()
juga.(context as IObjectContextAdapter).ObjectContext.SaveChanges()
akan tetap berfungsi. Pilihan terbaik adalah menggunakanDbContext(string nameOrConnectionString);
contstructor dengan string koneksi baca / tulis untuk hal-hal pembuatan database dan string koneksi hanya baca sesudahnya.Berbeda dengan jawaban yang diterima, saya percaya akan lebih baik untuk lebih memilih komposisi daripada warisan . Maka tidak perlu menyimpan metode seperti SaveChanges untuk membuat pengecualian. Selain itu, mengapa Anda perlu memiliki metode seperti itu sejak awal? Anda harus mendesain kelas sedemikian rupa sehingga konsumennya tidak tertipu ketika melihat daftar metodenya. Antarmuka publik harus sejalan dengan maksud dan tujuan kelas yang sebenarnya sementara dalam jawaban yang diterima memiliki SaveChanges tidak berarti bahwa Konteks hanya-baca.
Di tempat-tempat di mana saya perlu memiliki konteks hanya-baca seperti di sisi Baca pola CQRS , saya menggunakan implementasi berikut. Itu tidak memberikan apa pun selain kemampuan Querying kepada konsumennya.
Dengan menggunakan ReadOnlyDataContext, Anda hanya dapat memiliki akses ke kemampuan kueri DbContext. Misalkan Anda memiliki entitas bernama Order, maka Anda akan menggunakan instance ReadOnlyDataContext dengan cara seperti di bawah ini.
sumber
IDisposable
public IQueryable<TEntity> Get<TEntity>() where TEntity : class { return _dbContext.Query<TEntity>().AsNoTracking(); }