'Microsoft.SqlServer.Types' versi 10 atau lebih tinggi tidak dapat ditemukan di Azure

98

Saya mencoba membuat webapi di ASP.NET MVC 4. Webapi menggunakan Entity Framework 5 Spatial type dan saya telah menulis kode yang sangat sederhana.

  public List<Area> GetAllAreas()
    {
        List<Area> aList = db.Areas.ToList();
        return aList;
    }

Area berisi DbGeometry.

Ketika saya menjalankan lokal ini berfungsi, tetapi ketika saya mempublikasikannya ke biru itu memberi saya kesalahan ini:

Jenis spasial dan fungsi tidak tersedia untuk penyedia ini karena rakitan 'Microsoft.SqlServer.Types' versi 10 atau lebih tinggi tidak dapat ditemukan.

Adakah yang tahu bagaimana menyelesaikan ini? :)

Terima kasih!

Thomas Bolander
sumber
2
Apakah Anda menggunakan Situs Web Azure atau peran web dalam Layanan Cloud? Juga, apakah database Anda adalah database SQL Azure? Sudahkah Anda mencoba menjalankan kode lokal Anda pada database SQL Azure, dan apakah itu berfungsi?
Joe Capka

Jawaban:

131

Saya menemukan solusinya! Instal saja paket nuget Microsoft.SqlServer.Types

PM> Instal-Paket Microsoft.SqlServer.Types

Tautan untuk info lebih lanjut

Thomas Bolander
sumber
4
Terima kasih. Ini baru saja terjadi pada saya setelah saya menerbitkan pada jam 2 pagi.
Lee Smith
3
Senang saya memasang paket nuget itu! Itu selalu membuatku juga.
Pure.Krome
OH TUHAN! itu menambahkan hampir 2MB data biner ke aplikasi web hanya untuk menggunakan DbGeography (tidak, terima kasih) itu juga berat pada CPU saat menggunakannya di SQL Server ... mengeluarkannya.
Yovav
13
@Yovav, setidaknya Anda menjalankan floppy disk. Saya tidak berpikir bahwa 2 MB data biner memiliki pengaruh apa pun dalam kinerja aplikasi Anda. Saya menyarankan Anda untuk menjalankan benchmark dan memberi tahu kami (dengan data nyata) dampaknya pada CPU.
Diomedes Domínguez
3
Itu tidak cukup untuk menyelesaikan masalah, saya harus melakukan jawaban Chris juga.
Shimmy Weitzhandler
114

The jawaban atas karya-baik saja ketika versi 11 (SQL Server 2012) perakitan dapat digunakan.

Saya mengalami masalah dengan ini karena solusi saya memiliki ketergantungan lain pada versi 13 (SQL Server 2016) dari rakitan yang sama. Dalam kasus ini, perhatikan bahwa Entity Framework (setidaknya v6.1.3) di-hardcode di SqlTypesAssemblyLoader (sumber pengecualian ini) untuk hanya mencari versi 10 dan 11 dari rakitan.

Untuk mengatasi ini, saya menemukan Anda dapat memberi tahu Entity Framework perakitan mana yang ingin Anda gunakan seperti ini:

SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Chris
sumber
2
Tempat yang bagus - juga berlaku untuk mesin yang hanya menginstal SQL 2014 CLR Type. Dalam kasus kami, kami baru saja menginstal Jenis CLR SQL 2012 dan memperbaiki masalah; tetapi jika Anda memiliki ketergantungan khusus pada versi rakitan yang lebih tinggi maka ini tampaknya menjadi solusi terbaik.
Andras Zoltan
1
Ini adalah properti publik statis. Ini harus disetel saat aplikasi dimulai. Misalnya, saya menyetelnya di acara Application_Start di Global.asax.cs aplikasi web saya.
Chris
3
+1 Ini adalah satu-satunya hal yang berhasil bagi saya. Saya meletakkannya di konstruktor EntityContextkelas khusus saya (yang mewarisi DbContext).
Chris
2
Selamatkan daging saya!
Matt Cashatt
23
Untuk menghindari pengkodean keras nama perakitan yang dapat Anda gunakanSqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Samuel Jack
68

Untuk beberapa alasan saya kehilangan pengalihan yang mengikat yang memperbaiki masalah ini untuk saya.

Menambahkan yang berikut ini memperbaiki masalah saya

    <dependentAssembly>
      <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
      <bindingRedirect oldVersion="10.0.0.0-11.0.0.0" newVersion="14.0.0.0" />
    </dependentAssembly>
Lord Darth Vader
sumber
2
Untuk mengetahui nomor versi dari Microsoft.SqlServer. Jenis pada mesin Anda, Anda dapat menggunakan di AppDomain currentDomain = AppDomain.CurrentDomain; Assembly[] assems = currentDomain.GetAssemblies(); foreach (Assembly assembly in assems) { _logger.Info(assembly.GetName().FullName); }mana _logger adalah Nlog logger
Daniël Tulp
1
Ini memecahkan masalah saya (karena tipe sudah dipasang dalam kasus saya). Jika masih ada yang mendapatkan kesalahan setelah menginstal Jenis SQL Server, periksa jawaban ini.
Bisakah Poyrazoğlu
1
@ R2D2 Terima kasih, ini juga memperbaikinya untuk saya.
Ogglas
1
Saya menginstal SQLServerTypes dan masih menghadapi masalah. Menambahkan ini ke web.config memperbaikinya untuk saya.
saurabhj
25

Ada 2 cara untuk memperbaikinya:

  1. Jika Anda memiliki akses server, cukup Instal "Jenis CLR Sistem Microsoft untuk SQL Server 2012" dari https://www.microsoft.com/en-us/download/details.aspx?id=29065 Atau Gunakan Tautan Langsung Di Bawah Tautan Langsung ke X86: http://go.microsoft.com/fwlink/?LinkID=239643&clcid=0x409 , Atau Tautan Langsung ke X64: http://go.microsoft.com/fwlink/?LinkID=239644&clcid=0x409
  2. Cara kedua adalah dengan menggunakan pengelola paket NuGet dan menginstal

    Instal-Paket Microsoft.SqlServer.Types

Kemudian ikuti catatan plugin seperti di bawah ini

Untuk menyebarkan aplikasi yang menggunakan tipe data spasial ke mesin yang tidak memiliki 'Tipe CLR Sistem untuk SQL Server' yang diinstal, Anda juga perlu menyebarkan rakitan asli SqlServerSpatial110.dll. Versi x86 (32 bit) dan x64 (64 bit) dari rakitan ini telah ditambahkan ke proyek Anda di bawah subdirektori SqlServerTypes \ x86 dan SqlServerTypes \ x64. Rakitan asli msvcr100.dll juga disertakan jika runtime C ++ tidak diinstal.

Anda perlu menambahkan kode untuk memuat salah satu rakitan ini yang benar pada waktu proses (bergantung pada arsitektur saat ini).

Aplikasi ASP.NET Untuk aplikasi ASP.NET, tambahkan baris kode berikut ke metode Application_Start di Global.asax.cs:

SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));

Aplikasi desktop Untuk aplikasi desktop, tambahkan baris kode berikut untuk dijalankan sebelum operasi spasial dilakukan:

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
Tarek El-Mallah
sumber
2
Menginstal SQL Server atau NuGet tidak menyelesaikan apa pun, Jenis CLR sederhana itu memecahkan masalah. Ini harus menjadi solusi yang diterima.
Bisakah Poyrazoğlu
1
Tautan ke X64 berfungsi untuk saya di Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 28 Okt 2016 18:17:30 Hak Cipta (c) Microsoft Corporation Express Edition (64-bit) di Windows 10 Enterprise 6,3 <X64> (Build 10586:)
zapoo
Saya perlu menggunakan pemuat gaya ASP.NET tetapi jalur pengembangan saya ~/alih - alih ~/bin. Pastikan untuk memeriksa jalur Anda juga.
jocull
Saya dapat menginstal paket server SQL untuk versi SQL yang saya inginkan tetapi saya benar-benar harus memastikan pengalihan pengikatan diarahkan ke versi yang diinstal karena semuanya berbeda untuk setiap versi SQL server.
Chris Rice
13

Saya juga mengalami masalah ini, tetapi paket nuget Microsoft.SqlServer.Types sudah diinstal.

Apa yang memecahkan masalah bagi saya adalah pergi ke Solution> References> System.Data.Entity> Properties> Copy Local, dan mengaturnya ke True.

Catatan: Salin Lokal untuk Microsoft.SqlServer.Types sudah disetel ke true, dan meskipun masalahnya ada di System.Data.Entity, pesan kesalahannya masih tentang Microsoft.SqlServer.Types.

Solusinya adalah dari forum Windows Azure .

Lumière yang tidak bisa digunakan
sumber
1
Pilihan ini tidak tersedia pada paket nuget.
Shimmy Weitzhandler
Itu karena, seperti yang disebutkan, itu ada dalam opsi properti referensi, bukan opsi nuget :) Terima kasih atas solusi Anda! Bekerja untuk saya
Emixam23
9

Silakan tambahkan "dependentAssembly" ke file Web.config

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-14.0.0.0" newVersion="14.0.0.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

Ini berhasil untuk saya

Ertuğrul Üngör
sumber
5

Solusi bagi saya hanya menambahkan baris kode ini ke Global.asax.cs di Application_Start():

SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));

Semoga beruntung saudara-saudaraku.

devKoen1
sumber
3

Mengikuti komentar dalam jawaban untuk posting saat ini, menambahkan dua baris ini (lebih disukai ke fungsi utama) memecahkan masalah saya untuk Aplikasi Konsol:

SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);
Saeed Mohtasham
sumber
3

Dalam kasus saya (a App WebForms) Aku memecahkan masalah menambahkan baris berikut dalam Application_Startsatu Global.asaxberkas.

SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));
System.Data.Entity.SqlServer.SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";

Saya harap ini membantu seseorang.

Dr TJ
sumber
1
ini berfungsi untuk lingkungan VS 2019, perbaikan terbaru. terima kasih telah berbagi
coder kemp
1

Tidak ada solusi di atas yang berhasil bagi saya.

  • Paket Fitur SQL Server diinstal? Iya
  • Paket NuGet sudah terpasang? Iya
  • DLL ada di GAC dan di bin proyek? Iya

Tahukah Anda, kesalahan ini juga bisa disebabkan oleh sumber daya yang rendah di server . Saya memulai ulang SQL server dan diselesaikan secara otomatis.

MPM
sumber
0

Baru saja mengalami masalah yang sama. Saya menggunakan EF6dan memanggil SQLyang memiliki fungsi SQL yang menggunakan perintah spasial. Saya menguji ini melalui unit test dan bekerja dengan baik. Ketika saya pergi untuk memasang Asp.Netsolusi saya, saya menerima kesalahan

Jenis spasial dan fungsi tidak tersedia untuk penyedia ini karena rakitan 'Microsoft.SqlServer.Types' versi 10 atau lebih tinggi tidak dapat ditemukan.

Dengan menambahkan NUGETpaket "Microsoft.SqlServer.Types" dan menambahkan SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));di Application_Start methoddalam Global.asax.cssemuanya bekerja dengan baik.

Bayer White
sumber
0

Dalam kasus saya, string koneksi yang disusun dengan buruk menyebabkan hal ini. Verifikasi apakah string koneksi Anda disusun dengan benar.

Raghu Reddy Muttana
sumber