Không thể tìm thấy 'Microsoft.SqlServer.Types' phiên bản 10 trở lên trên Azure


98

Tôi đang cố gắng tạo một webapi trong ASP.NET MVC 4. Webapi đã sử dụng Entity Framework 5 Loại không gian và tôi đã viết một đoạn mã rất đơn giản.

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

Vùng chứa DbGeometry.

Khi tôi chạy cục bộ này, nó hoạt động, nhưng khi tôi xuất bản nó lên azure, nó cho tôi lỗi sau:

Loại không gian và chức năng không khả dụng cho nhà cung cấp này vì không thể tìm thấy lắp ráp 'Microsoft.SqlServer.Types' phiên bản 10 trở lên.

Bất cứ ai biết làm thế nào để giải quyết điều này? :)

Cảm ơn!


2
Bạn đang sử dụng Azure Web Sites hay một vai trò web trong Dịch vụ đám mây? Ngoài ra, cơ sở dữ liệu của bạn có phải là cơ sở dữ liệu SQL Azure không? Bạn đã thử chạy mã cục bộ của mình với cơ sở dữ liệu SQL Azure chưa và điều đó có hoạt động không?
Joe Capka

Câu trả lời:


131

Tôi đã tìm thấy giải pháp! Chỉ cần cài đặt gói nuget Microsoft.SqlServer.Types

PM> Gói cài đặt Microsoft.SqlServer.Types

Liên kết để biết thêm thông tin


4
Cảm ơn. Điều này chỉ xảy ra với tôi sau khi tôi xuất bản lúc 2 giờ sáng.
Lee Smith

3
Rất vui vì tôi đã đưa gói nuget đó lên! Tôi cũng vậy.
Pure.Krome

CHÚA ƠI! nó thêm gần 2MB dữ liệu nhị phân vào ứng dụng web chỉ để sử dụng DbGeography (không, cảm ơn) nó cũng nặng về CPU khi sử dụng nó trong SQL Server ... lấy nó ra.
Yovav

13
@Yovav, ít nhất bạn đang chạy trên đĩa mềm Tôi không nghĩ rằng 2 MB dữ liệu nhị phân có bất kỳ ảnh hưởng nào đến hiệu suất của ứng dụng của bạn. Tôi khuyên bạn nên chạy một điểm chuẩn và cho chúng tôi biết (với dữ liệu thực) về tác động của CPU.
Diomedes Domínguez

3
Điều đó không đủ để giải quyết vấn đề, tôi cũng phải trả lời câu trả lời của Chris .
Shimmy Weitzhandler

114

Câu trả lời ở trên hoạt động tốt khi có thể sử dụng phiên bản 11 (SQL Server 2012) của hợp ngữ.

Tôi đã gặp sự cố với điều này vì giải pháp của tôi có các phụ thuộc khác vào phiên bản 13 (SQL Server 2016) của cùng một hội đồng. Trong trường hợp này, hãy lưu ý rằng Entity Framework (ít nhất là v6.1.3) được mã hóa cứng trong SqlTypesAssemblyLoader (nguồn của ngoại lệ này) để chỉ tìm kiếm các phiên bản 10 và 11 của assembly.

Để giải quyết vấn đề này, tôi phát hiện ra rằng bạn có thể cho Entity Framework biết bạn muốn sử dụng lắp ráp nào như sau:

SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;

2
Điểm tuyệt vời - cũng áp dụng cho các máy chỉ cài đặt Kiểu CLR SQL 2014. Trong trường hợp của chúng tôi, chúng tôi vừa cài đặt Các loại CLR SQL 2012 và nó đã khắc phục sự cố; nhưng nếu bạn có sự phụ thuộc cụ thể vào các phiên bản cao hơn của hội đồng thì điều này có vẻ là giải pháp tốt nhất.
Andras Zoltan

1
Đó là một tài sản công cộng tĩnh. Nó phải được thiết lập khi khởi động ứng dụng. Ví dụ: tôi đang đặt nó trong sự kiện Application_Start trong Global.asax.cs của ứng dụng web của tôi.
Chris

3
+1 Đây là điều duy nhất đã làm việc cho tôi. Tôi đặt nó trong hàm tạo của EntityContextlớp tùy chỉnh của tôi (kế thừa DbContext).
Chris

2
Đã lưu thịt xông khói của tôi!
Matt Cashatt

23
Để tránh cứng mã hóa lắp ráp tên bạn có thể sử dụngSqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Samuel Jack

68

Vì một số lý do, tôi đã thiếu một chuyển hướng ràng buộc đã khắc phục sự cố này cho tôi.

Thêm phần sau đã khắc phục sự cố của tôi

    <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>

2
Để tìm hiểu những gì số phiên bản là của Microsoft.SqlServer.Types trên máy tính của bạn, bạn có thể sử dụng AppDomain currentDomain = AppDomain.CurrentDomain; Assembly[] assems = currentDomain.GetAssemblies(); foreach (Assembly assembly in assems) { _logger.Info(assembly.GetName().FullName); }nơi _logger là một logger nLog
Daniel Tulp

1
Điều này đã giải quyết vấn đề của tôi (vì các loại đã được cài đặt trong trường hợp của tôi). Nếu ai đó vẫn gặp lỗi sau khi cài đặt Các loại máy chủ SQL, hãy kiểm tra câu trả lời này.
Có thể Poyrazoğlu

1
@ R2D2 Cảm ơn bạn, điều này đã sửa nó cho tôi.
Ogglas

1
Tôi đã cài đặt SQLServerTypes và vẫn gặp sự cố. Thêm điều này vào web.config đã sửa nó cho tôi.
saurabhj

25

Có 2 cách để khắc phục điều đó:

  1. Nếu bạn có quyền truy cập máy chủ, chỉ cần Cài đặt “Loại CLR Hệ thống Microsoft cho SQL Server 2012” từ https://www.microsoft.com/en-us/download/details.aspx?id=29065 Hoặc Sử dụng Liên kết Trực tiếp Dưới Liên kết Trực tiếp tới X86: http://go.microsoft.com/fwlink/?LinkID=239643&clcid=0x409 , Hoặc Liên kết trực tiếp tới X64: http://go.microsoft.com/fwlink/?LinkID=239644&clcid=0x409
  2. Cách thứ hai là sử dụng trình quản lý gói NuGet và cài đặt

    Gói cài đặt Microsoft.SqlServer.Types

Sau đó làm theo các ghi chú plugin như bên dưới

Để triển khai ứng dụng sử dụng kiểu dữ liệu không gian cho một máy chưa cài đặt 'Loại CLR hệ thống cho SQL Server', bạn cũng cần triển khai lắp ráp gốc SqlServerSpatial110.dll. Cả hai phiên bản x86 (32 bit) và x64 (64 bit) của assembly này đã được thêm vào dự án của bạn trong các thư mục con SqlServerTypes \ x86 và SqlServerTypes \ x64. Hợp ngữ gốc msvcr100.dll cũng được bao gồm trong trường hợp thời gian chạy C ++ không được cài đặt.

Bạn cần thêm mã để tải đúng một trong các hội đồng này trong thời gian chạy (tùy thuộc vào kiến ​​trúc hiện tại).

Ứng dụng ASP.NET Đối với các ứng dụng ASP.NET, hãy thêm dòng mã sau vào phương thức Application_Start trong Global.asax.cs:

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

Ứng dụng máy tính để bàn Đối với các ứng dụng máy tính để bàn, thêm dòng mã sau để chạy trước khi thực hiện bất kỳ hoạt động không gian nào:

SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);

2
Cài đặt SQL Server hoặc NuGet không giải quyết được bất cứ điều gì, các Loại CLR đơn giản đó đã giải quyết được vấn đề. Đây phải là giải pháp được chấp nhận.
Có thể Poyrazoğlu

1
Liên kết đến X64 được làm việc cho tôi trên Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 28 tháng 10 năm 2016 18:17:30 Bản quyền (c) Microsoft Corporation Express Edition (64-bit) trên Windows 10 Enterprise 6.3 <X64> (Bản dựng 10586:)
zapoo

Tôi cần sử dụng trình tải kiểu ASP.NET nhưng đường dẫn phát triển của tôi ~/thay vì ~/bin. Hãy chắc chắn kiểm tra việc vỗ nhẹ của bạn.
jocull

Tôi đã có thể cài đặt gói máy chủ SQL cho phiên bản SQL mà tôi muốn nhưng tôi hoàn toàn phải đảm bảo chuyển hướng liên kết được trỏ đến phiên bản đã cài đặt vì chúng đều khác nhau đối với mỗi phiên bản máy chủ SQL.
Chris Rice

13

Tôi cũng gặp sự cố này nhưng gói nuget Microsoft.SqlServer.Types đã được cài đặt.

Điều đã giải quyết vấn đề cho tôi là đi tới Giải pháp> Tham chiếu> System.Data.Entity> Thuộc tính> Sao chép cục bộ và đặt nó thành True.

Lưu ý: Copy Local cho Microsoft.SqlServer.Types đã được đặt thành true và mặc dù sự cố xảy ra với System.Data.Entity, thông báo lỗi vẫn là về Microsoft.SqlServer.Types.

Giải pháp là từ diễn đàn Windows Azure .


1
Tùy chọn này không có sẵn trên các gói nuget.
Shimmy Weitzhandler

Đó là bởi vì, như đã đề cập, nó nằm trong các tùy chọn thuộc tính của tham chiếu, không phải tùy chọn của nuget :) Cảm ơn vì giải pháp của bạn! Làm việc cho tôi
Emixam23

8

Hãy thêm tệp Web.config "pendAssembly "

<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>

Điều này đã làm việc cho tôi


5

Giải pháp cho tôi chỉ là thêm dòng mã này vào Global.asax.cs trong Application_Start():

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

Chúc anh em may mắn.


3

Sau nhận xét trong câu trả lời cho bài đăng hiện tại, thêm hai dòng này (rất thích hợp cho chức năng chính) đã giải quyết được vấn đề của tôi cho Ứng dụng Console:

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

2

Trong trường hợp của tôi (một WebForms App) Tôi đã giải quyết được vấn đề thêm các dòng sau đây trong Application_Startcác Global.asaxtập tin.

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

Tôi hi vọng nó giúp ích cho ai đó.


điều này hoạt động cho môi trường VS 2019, bản sửa lỗi mới nhất. cảm ơn vì đã chia sẻ
coder kemp

1

Không có giải pháp nào ở trên làm việc với tôi.

  • Gói tính năng SQL Server đã được cài đặt? Đúng
  • Đã cài đặt gói NuGet? Đúng
  • DLL tồn tại trong GAC và trong thùng dự án? Đúng

Bạn biết gì không, lỗi này cũng có thể do tài nguyên trên máy chủ thấp . Tôi đã khởi động lại máy chủ SQL và nó đã được giải quyết tự động.


0

Chỉ có cùng một vấn đề. Tôi đang sử dụng EF6và gọi SQLhàm có hàm SQL sử dụng lệnh không gian. Tôi đã kiểm tra điều này thông qua một bài kiểm tra đơn vị và nó hoạt động tốt. Khi tôi bắt đầu Asp.Netgiải pháp của mình, tôi đã nhận được lỗi

Loại không gian và chức năng không khả dụng cho nhà cung cấp này vì không thể tìm thấy lắp ráp 'Microsoft.SqlServer.Types' phiên bản 10 trở lên.

Bằng cách thêm vào các NUGETgói "Microsoft.SqlServer.Types" và thêm SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));vào Application_Start methodtrong Global.asax.cstất cả mọi thứ làm việc tốt.


0

Trong trường hợp của tôi, một chuỗi kết nối không hợp lệ đã gây ra điều này. Xác minh xem chuỗi kết nối của bạn có được tạo đúng cách hay không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.