ไม่พบ 'Microsoft.SqlServer.Types' เวอร์ชัน 10 หรือสูงกว่าบน Azure


98

ฉันกำลังพยายามสร้าง webapi ใน ASP.NET MVC 4 webapi ใช้ Entity Framework 5 Spatial types และฉันได้เขียนโค้ดง่ายๆ

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

พื้นที่มี DbGeometry

เมื่อฉันเรียกใช้ท้องถิ่นนี้มันใช้งานได้ แต่เมื่อฉันเผยแพร่เป็นสีฟ้ามันทำให้ฉันเกิดข้อผิดพลาดนี้:

ประเภทและฟังก์ชันเชิงพื้นที่ไม่พร้อมใช้งานสำหรับผู้ให้บริการรายนี้เนื่องจากไม่พบแอสเซมบลี 'Microsoft.SqlServer.Types' เวอร์ชัน 10 ขึ้นไป

ใครทราบวิธีแก้ปัญหานี้ :)

ขอบคุณ!


2
คุณใช้เว็บไซต์ Azure หรือบทบาทเว็บใน Cloud Services หรือไม่ นอกจากนี้ฐานข้อมูลของคุณเป็นฐานข้อมูล SQL Azure หรือไม่ คุณได้ลองรันโค้ดภายในเครื่องของคุณกับฐานข้อมูล SQL Azure แล้วหรือยัง
Joe Capka

คำตอบ:


131

ฉันพบทางออกแล้ว! เพียงติดตั้งแพคเกจ nuget Microsoft.SqlServer.Types

PM> ติดตั้งแพ็คเกจ Microsoft.SqlServer.Types

ลิงก์สำหรับข้อมูลเพิ่มเติม


4
ขอบคุณ. สิ่งนี้เพิ่งเกิดขึ้นกับฉันหลังจากที่ฉันเผยแพร่ตอนตีสอง
Lee Smith

3
ดีใจที่ได้ทำแพ็คเกจ nuget ขึ้นมา! มันมักจะทำให้ฉันได้รับเช่นกัน
Pure.Krome

พระเจ้าช่วย! มันเพิ่มข้อมูลไบนารีเกือบ 2MB ลงในเว็บแอปเพียงเพื่อใช้ DbGeography (ไม่เป็นไร) นอกจากนี้ยังมี CPU หนักเมื่อใช้ใน SQL Server ...
Yovav

13
@Yovav อย่างน้อยคุณกำลังทำงานในฟล็อปปี้ดิสก์ฉันไม่คิดว่าข้อมูลไบนารี 2 MB จะมีอิทธิพลต่อประสิทธิภาพของแอปพลิเคชันของคุณ ฉันขอแนะนำให้คุณเรียกใช้เกณฑ์มาตรฐานและแจ้งให้เราทราบ (พร้อมข้อมูลจริง) ผลกระทบใน CPU
Diomedes Domínguez

3
นั่นยังไม่เพียงพอที่จะแก้ปัญหาฉันต้องตอบคำถามของคริสด้วย
Shimmy Weitzhandler

115

คำตอบข้างต้นผลงานดีเมื่อรุ่น 11 (SQL Server 2012) ของการชุมนุมสามารถนำมาใช้

ฉันมีปัญหากับสิ่งนี้เนื่องจากโซลูชันของฉันมีการอ้างอิงอื่น ๆ ในเวอร์ชัน 13 (SQL Server 2016) ของแอสเซมบลีเดียวกัน ในกรณีนี้โปรดทราบว่า Entity Framework (อย่างน้อย v6.1.3) เป็นฮาร์ดโค้ดในSqlTypesAssemblyLoader (ที่มาของข้อยกเว้นนี้) เพื่อค้นหาเฉพาะเวอร์ชัน 10 และ 11 ของแอสเซมบลี

ในการหลีกเลี่ยงสิ่งนี้ฉันพบว่าคุณสามารถบอก Entity Framework ว่าคุณต้องการใช้แอสเซมบลีใดเช่นนี้:

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

2
จุดที่ดี - ยังใช้กับเครื่องที่ติดตั้งเฉพาะ SQL 2014 CLR types ในกรณีของเราเราเพิ่งติดตั้ง SQL 2012 CLR types และแก้ไขปัญหาได้แล้ว แต่ถ้าคุณมีการพึ่งพาเฉพาะกับแอสเซมบลีเวอร์ชันที่สูงกว่าสิ่งนี้ดูเหมือนจะเป็นทางออกที่ดีที่สุด
Andras Zoltan

1
เป็นทรัพย์สินสาธารณะแบบคงที่ ควรตั้งค่าเมื่อเริ่มต้นแอปพลิเคชัน เช่นฉันตั้งค่าในเหตุการณ์ Application_Start ใน Global.asax.cs ของเว็บแอปพลิเคชันของฉัน
คริส

3
+1 นี่คือสิ่งเดียวที่ได้ผลสำหรับฉัน ฉันใส่ไว้ในตัวสร้างของEntityContextคลาสที่กำหนดเองของฉัน(ที่สืบทอดมาDbContext)
Chris

2
ช่วยเบคอนของฉัน!
Matt Cashatt

23
เพื่อหลีกเลี่ยงการเข้ารหัสชื่อแอสเซมบลีที่ยากคุณสามารถใช้ได้SqlProviderServices.SqlServerTypesAssemblyName = typeof(SqlGeography).Assembly.FullName;
Samuel Jack

68

ด้วยเหตุผลบางอย่างฉันไม่มีการเปลี่ยนเส้นทางการเชื่อมโยงซึ่งแก้ไขปัญหานี้ให้ฉัน

การเพิ่มสิ่งต่อไปนี้ช่วยแก้ปัญหาของฉันได้

    <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
ในการค้นหาหมายเลขเวอร์ชันของ Microsoft.SqlServer.Types บนเครื่องของคุณคุณสามารถใช้โดยAppDomain currentDomain = AppDomain.CurrentDomain; Assembly[] assems = currentDomain.GetAssemblies(); foreach (Assembly assembly in assems) { _logger.Info(assembly.GetName().FullName); }ที่ _logger เป็นเครื่องบันทึก Nlog
Daniël Tulp

1
สิ่งนี้ช่วยแก้ปัญหาของฉันได้ (เนื่องจากมีการติดตั้งประเภทในกรณีของฉันแล้ว) หากใครยังคงได้รับข้อผิดพลาดหลังจากติดตั้ง SQL Server types ให้ตรวจสอบคำตอบนี้
Can Poyrazoğlu

1
@ R2D2 ขอบคุณสิ่งนี้แก้ไขให้ฉันเช่นกัน
Ogglas

1
ฉันติดตั้ง SQLServerTypes แล้วและยังคงประสบปัญหา การเพิ่มสิ่งนี้ไปยัง web.config แก้ไขให้ฉัน
saurabhj

26

มี 2 ​​วิธีในการแก้ไข:

  1. หากคุณมีการเข้าถึงเซิร์ฟเวอร์เพียงแค่ติดตั้ง“ Microsoft System CLR types for SQL Server 2012” จากhttps://www.microsoft.com/en-us/download/details.aspx?id=29065 หรือใช้ Direct Link ด้านล่าง Direct Link ไปที่ X86: http://go.microsoft.com/fwlink/?LinkID=239643&clcid=0x409 หรือ Direct Link ไปยัง X64: http://go.microsoft.com/fwlink/?LinkID=239644&clcid=0x409
  2. วิธีที่สองคือใช้ NuGet package manager และติดตั้ง

    ติดตั้งแพ็คเกจ Microsoft.SqlServer.Types

จากนั้นทำตามหมายเหตุของปลั๊กอินด้านล่าง

ในการปรับใช้แอปพลิเคชันที่ใช้ชนิดข้อมูลเชิงพื้นที่ไปยังเครื่องที่ไม่ได้ติดตั้ง 'System CLR types for SQL Server' คุณต้องปรับใช้แอสเซมบลีดั้งเดิม SqlServerSpatial110.dll มีการเพิ่มแอสเซมบลีนี้ทั้งรุ่น x86 (32 บิต) และ x64 (64 บิต) ในโปรเจ็กต์ของคุณภายใต้ไดเร็กทอรีย่อย SqlServerTypes \ x86 และ SqlServerTypes \ x64 นอกจากนี้ยังรวม msvcr100.dll แอสเซมบลีดั้งเดิมในกรณีที่ไม่ได้ติดตั้งรันไทม์ C ++

คุณต้องเพิ่มโค้ดเพื่อโหลดแอสเซมบลีเหล่านี้ที่ถูกต้องในรันไทม์ (ขึ้นอยู่กับสถาปัตยกรรมปัจจุบัน)

แอปพลิเคชัน ASP.NET สำหรับแอปพลิเคชัน ASP.NET เพิ่มบรรทัดของโค้ดต่อไปนี้ในเมธอด Application_Start ใน Global.asax.cs:

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

แอปพลิเคชันเดสก์ท็อปสำหรับแอปพลิเคชันเดสก์ท็อปให้เพิ่มบรรทัดโค้ดต่อไปนี้เพื่อเรียกใช้ก่อนดำเนินการเชิงพื้นที่:

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

2
การติดตั้ง SQL Server หรือ NuGet ไม่ได้ช่วยแก้ปัญหา แต่อย่างใดประเภท CLR ที่เรียบง่ายเหล่านั้นช่วยแก้ปัญหาได้ นี่ควรเป็นทางออกที่ได้รับการยอมรับ
Can Poyrazoğlu

1
ลิงก์ไปยัง X64 ใช้งานได้สำหรับฉันบน Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) 28 ตุลาคม 2559 18:17:30 ลิขสิทธิ์ (c) Microsoft Corporation Express Edition (64 บิต) บน Windows 10 Enterprise 6.3 <X64> (รุ่น 10586
:)

ฉันต้องการใช้ตัวโหลดสไตล์ ASP.NET แต่เส้นทางการพัฒนาของฉัน~/แทนที่จะเป็น~/bin. อย่าลืมตรวจสอบเส้นทางของคุณด้วย
jocull

ฉันสามารถติดตั้งแพ็คเซิร์ฟเวอร์ SQL สำหรับเวอร์ชันของ SQL ที่ฉันต้องการได้ แต่ฉันต้องตรวจสอบให้แน่ใจว่าการเปลี่ยนทิศทางการโยงถูกชี้ไปที่เวอร์ชันที่ติดตั้งเนื่องจากทั้งหมดแตกต่างกันไปสำหรับเซิร์ฟเวอร์ SQL แต่ละเวอร์ชัน
Chris Rice

13

ฉันพบปัญหานี้เช่นกัน แต่ติดตั้งแพคเกจ Microsoft.SqlServer.Types nuget แล้ว

สิ่งที่แก้ปัญหาให้ฉันได้คือไปที่ Solution> References> System.Data.Entity> Properties> Copy Local และตั้งค่าเป็น True

หมายเหตุ: คัดลอก Local สำหรับ Microsoft.SqlServer.Types แล้วตั้งค่าเป็น true และแม้ว่าปัญหาจะเกิดกับ System.Data.Entity แต่ข้อความแสดงข้อผิดพลาดยังคงเกี่ยวกับ Microsoft.SqlServer.Types

การแก้ปัญหาคือจากฟอรั่ม Windows Azure


1
ตัวเลือกนี้ไม่มีในแพ็กเกจ nuget
Shimmy Weitzhandler

เป็นเพราะตามที่กล่าวไว้มันอยู่ในตัวเลือกคุณสมบัติของข้อมูลอ้างอิงไม่ใช่ตัวเลือกของนักเก็ต :) ขอบคุณสำหรับวิธีแก้ปัญหาของคุณ! ทำงานให้ฉัน
Emixam23

9

โปรดเพิ่ม "dependAssembly" ไฟล์ 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>

สิ่งนี้ได้ผลสำหรับฉัน


5

วิธีแก้ปัญหาสำหรับฉันคือเพิ่มบรรทัดของโค้ดนี้ใน Global.asax.cs ในApplication_Start():

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

ขอให้โชคดีครับพี่น้อง


3

การติดตามความคิดเห็นในคำตอบสำหรับโพสต์ปัจจุบันการเพิ่มสองบรรทัดนี้ (ควรเป็นฟังก์ชันหลัก) ช่วยแก้ปัญหาของฉันสำหรับแอปคอนโซล:

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

3

ในกรณีของฉัน (ก WebForms App) ฉันแก้ปัญหาการเพิ่มบรรทัดต่อไปนี้ในApplication_StartของGlobal.asaxไฟล์

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

ฉันหวังว่ามันจะช่วยใครสักคน


1
สิ่งนี้ใช้ได้กับสภาพแวดล้อม VS 2019 การแก้ไขล่าสุด ขอบคุณสำหรับการแบ่งปัน
coder kemp

1

วิธีแก้ปัญหาข้างต้นไม่ได้ผลกับฉัน

  • ติดตั้งชุดคุณลักษณะของเซิร์ฟเวอร์ SQL หรือไม่ ใช่
  • ติดตั้งแพ็คเกจ NuGet หรือไม่ ใช่
  • DLL อยู่ใน GAC และในถังโครงการ? ใช่

คุณรู้อะไรข้อผิดพลาดนี้อาจเกิดจากทรัพยากรบนเซิร์ฟเวอร์เหลือน้อย ฉันรีสตาร์ทเซิร์ฟเวอร์ SQL และได้รับการแก้ไขโดยอัตโนมัติ


0

เพิ่งมีปัญหาเดียวกัน ฉันใช้EF6และเรียกSQLซึ่งมีฟังก์ชัน SQL ที่ใช้คำสั่งเชิงพื้นที่ ฉันทดสอบสิ่งนี้ผ่านการทดสอบหน่วยและทำงานได้ดี เมื่อฉันวางสายAsp.Netโซลูชันของฉันฉันได้รับข้อผิดพลาด

ประเภทและฟังก์ชันเชิงพื้นที่ไม่พร้อมใช้งานสำหรับผู้ให้บริการรายนี้เนื่องจากไม่พบแอสเซมบลี 'Microsoft.SqlServer.Types' เวอร์ชัน 10 ขึ้นไป

ด้วยการเพิ่มNUGETแพ็คเกจ "Microsoft.SqlServer.Types" และเพิ่มSqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin"));เข้าไปApplication_Start methodในGlobal.asax.csทุกอย่างทำงานได้ดี


0

ในกรณีของฉันสตริงการเชื่อมต่อที่ประกอบไม่ดีทำให้เกิดสิ่งนี้ ตรวจสอบว่าสตริงการเชื่อมต่อของคุณประกอบถูกต้องหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.