Saya mendapatkan batas waktu menggunakan Entity Framework (EF) saat menggunakan fungsi impor yang membutuhkan waktu lebih dari 30 detik untuk menyelesaikannya. Saya mencoba yang berikut ini dan belum dapat menyelesaikan masalah ini:
Saya menambahkan Default Command Timeout=300000
ke string koneksi di file App.Config dalam proyek yang memiliki file EDMX seperti yang disarankan di sini .
Seperti inilah string koneksi saya:
<add
name="MyEntityConnectionString"
connectionString="metadata=res://*/MyEntities.csdl|res://*/MyEntities.ssdl|
res://*/MyEntities.msl;
provider=System.Data.SqlClient;provider connection string="
Data Source=trekdevbox;Initial Catalog=StarTrekDatabase;
Persist Security Info=True;User ID=JamesTKirk;Password=IsFriendsWithSpock;
MultipleActiveResultSets=True;Default Command Timeout=300000;""
providerName="System.Data.EntityClient" />
Saya mencoba mengatur CommandTimeout di repositori saya secara langsung seperti:
private TrekEntities context = new TrekEntities();
public IEnumerable<TrekMatches> GetKirksFriends()
{
this.context.CommandTimeout = 180;
return this.context.GetKirksFriends();
}
Apa lagi yang bisa saya lakukan untuk mengeluarkan EF dari waktu habis? Ini hanya terjadi untuk dataset yang sangat besar. Semuanya berfungsi baik dengan dataset kecil.
Inilah salah satu kesalahan yang saya dapatkan:
System.Data.EntityCommandExecutionException: Terjadi kesalahan saat menjalankan definisi perintah. Lihat pengecualian dalam untuk detailnya. ---> System.Data.SqlClient.SqlException: Batas waktu kedaluwarsa. Periode waktu habis berlalu sebelum penyelesaian operasi atau server tidak merespons.
OK - saya berhasil dan ini konyol apa yang terjadi. Saya memiliki string koneksi dengan Default Command Timeout=300000
dan CommandTimeout diatur ke 180. Ketika saya menghapus Default Command Timeout
dari string koneksi, itu berhasil. Jadi jawabannya adalah secara manual mengatur CommandTimeout di repositori Anda pada objek konteks Anda seperti:
this.context.CommandTimeout = 180;
Tampaknya pengaturan pengaturan batas waktu dalam string koneksi tidak berpengaruh padanya.
"
dalam string.NONCLUSTERED
indeks ke beberapa tabel, ini menyelesaikan masalah batas waktu bagi kami.Jawaban:
Ada bug yang dikenal dengan menentukan batas waktu perintah default dalam string koneksi EF.
http://bugs.mysql.com/bug.php?id=56806
Hapus nilai dari string koneksi dan atur pada objek konteks data itu sendiri. Ini akan berfungsi jika Anda menghapus nilai yang bertentangan dari string koneksi.
Kerangka Entitas Inti 1.0:
Kerangka Entitas 6:
Kerangka Entitas 5:
Kerangka Entitas 4 dan di bawah ini:
sumber
this.Database.SetCommandTimeout(180);
Jika Anda menggunakan DbContext, gunakan konstruktor berikut untuk mengatur batas waktu perintah:
sumber
DbContext
kelas turunan saya dibuat secara otomatis dari sebuahedmx
file?Jika Anda menggunakan
DbContext
dan EF v6 +, Anda juga dapat menggunakan:sumber
Biasanya saya menangani operasi saya dalam suatu transaksi . Seperti yang saya alami, tidak cukup untuk mengatur batas waktu perintah konteks, tetapi transaksi membutuhkan konstruktor dengan parameter batas waktu. Saya harus menetapkan kedua nilai time out agar berfungsi dengan benar.
Di akhir fungsi saya mengatur kembali perintah timeout ke nilai sebelumnya di prevto.
Menggunakan EF6
sumber
Saya tahu ini adalah thread yang sangat lama berjalan, tetapi EF masih belum memperbaikinya. Bagi orang yang menggunakan yang dibuat secara otomatis
DbContext
dapat menggunakan kode berikut untuk mengatur batas waktu secara manual.sumber
Jika Anda menggunakan Entity Framework seperti saya, Anda harus mendefinisikan Time out pada kelas Startup sebagai berikut:
sumber
Inilah yang saya danai. Mungkin itu akan membantu seseorang:
Jadi di sini kita mulai:
Jika Anda menggunakan LINQ dengan EF mencari beberapa elemen tepat yang ada dalam daftar seperti ini:
semuanya berjalan dengan baik sampai IdList berisi lebih dari satu Id.
Masalah "batas waktu" muncul jika daftar hanya berisi satu Id. Untuk mengatasi masalah ini gunakan jika kondisi untuk memeriksa jumlah id di IdList.
Contoh:
Penjelasan:
Cukup coba gunakan Sql Profiler dan periksa pernyataan Select yang dihasilkan oleh Entity frameeork. ...
sumber