EF5: ไม่สามารถแนบไฟล์ '{0}' เป็นฐานข้อมูล '{1}'


140

ฉันพบปัญหาตรงตามที่อธิบายไว้ที่นี่ (อ่านหัวข้อ "ไม่สามารถแนบไปกับไฟล์ MDF ที่ถูกลบ") แต่วิธีการแก้ไขปัญหาไม่ได้บอกว่ามี ...

ในระยะสั้นปัญหาคือหลังจากลบ.mdfไฟล์ข้อยกเว้นต่อไปนี้จะถูกโยนเมื่อฉันพยายามเข้าถึงฐานข้อมูลโดยใช้ EF 5.0

DataException-> EntityException-> SqlException:
ไม่สามารถแนบไฟล์ '{0}' เป็นฐานข้อมูล '{1}'

ฉันลบไฟล์ DB และตอนนี้ฉันได้รับข้อความแสดงข้อผิดพลาดที่น่ารังเกียจเมื่อเรียกใช้แอปพลิเคชันโดยคาดว่าจะใช้เป็นตัวเริ่มต้น มีวิธีใดบ้างในการแก้ไขปัญหานี้


1
ขออภัยฉันไม่ได้ให้คำตอบเฉพาะเจาะจง แต่ในเวลานั้นฉันไม่มีวิธีแก้ปัญหาที่ใช้งานได้ 100% ฉันพยายามหลีกเลี่ยงข้อผิดพลาดในตอนนี้โดยไม่ได้ใช้ฐานข้อมูลที่แนบมากับผู้ใช้ ฉันมักจะสามารถแก้ไขข้อผิดพลาดโดยการเชื่อมต่อกับ SQL Server Management Studio และการถอดฐานข้อมูลในข้อผิดพลาด
OdeToCode

ปัญหาคือฐานข้อมูลไม่มีอยู่อีกต่อไปเนื่องจากฉันลบไฟล์ทางกายภาพแล้ว ฉันพยายามดูแลมันในสตูดิโอแห่งใดแห่งหนึ่ง (รวมอยู่ใน VS และภายนอก) คำตอบของฉันไม่ใช่วิธีแก้ปัญหา แต่เป็นการแก้ปัญหาเพียงบอกว่าคุณไม่ต้องติด LocalDb
Shimmy Weitzhandler

จากผู้เชี่ยวชาญของ EF Rowan Miller - ดูromiller.com/2013/05/17/…เราหวังว่าจะให้บริการโซลูชั่นที่ดีกว่าในรุ่น VS ต่อไป
RickAndMSFT

คู่มือการแก้ไขปัญหาที่มีประโยชน์: odetocode.com/blogs/scott/archive/2012/08/15/…
Tim Abell

คำตอบ:


220

หากคุณลบไฟล์ DB ไฟล์นั้นจะยังคงลงทะเบียนกับ SqlLocalDB บางครั้งมันแก้ไขเพื่อลบฐานข้อมูล คุณสามารถทำได้จากบรรทัดคำสั่ง

  1. เปิด "Developer Command Propmpt สำหรับ VisualStudio" ภายใต้เมนูเริ่ม / โปรแกรมของคุณ
  2. รันคำสั่งต่อไปนี้:

    sqllocaldb.exe stop v11.0

    sqllocaldb.exe delete v11.0


1
ฉันไม่พบ Sql Server Object Explorer ฉันเดาเพราะฉันใช้ VS 2012 Express ดังนั้นฉันไม่สามารถลองคำตอบที่ยอมรับได้ อย่างไรก็ตามคำตอบของคุณเหมาะกับฉันอย่างสมบูรณ์ ขอบคุณ
นิวแมน

3
คำตอบของคุณเพิ่งช่วยฉัน ฉันไม่ได้มีโหนดย่อย (localdb) \ v11.0 จากคำตอบที่ยอมรับและฉันไม่สามารถลบการอ้างอิงจาก SQL Management Studio ได้ดังนั้นไชโยให้คุณ!
Santux

18
สิ่งนี้ใช้ได้สำหรับฉันหลังจากลบไฟล์ คุณยังสามารถเรียกใช้คำสั่งจากเครื่องมือ -> Library Package Manager -> Console Manager Package
Bart Verkoeijen

11
จากบันทึกย่อด้านข้างv11.0เป็นเฉพาะของ SQL LocalDB 2012 หากคุณใช้ LocalDB 2014 MS จะเปลี่ยนชื่อเป็น MS MSSqlLocalDbแทน
CodingWithSpike

4
ในความสัมพันธ์กับความคิดเห็นข้างต้นคุณยังไม่สามารถป้อนชื่อ db ใด ๆ และมันจะใช้กับค่าเริ่มต้นของคุณฉันใช้ด้านล่างกับ vs2015 และใช้งานได้: sqllocaldb.exe หยุด sqllocaldb.exe หยุดการลบ
sqllocaldb.exe

147

สำหรับผู้ที่ยังค้นหาวิธีแก้ปัญหา ...

ไปที่ View / SQL Server Object Explorer และลบฐานข้อมูลออกจากโหนดย่อย (localdb) \ v11.0!
ป้อนคำอธิบายรูปภาพที่นี่

มีฐานข้อมูลภายในที่เก็บไฟล์ที่ควรเป็นและถ้าคุณต้องการลบไฟล์ฐานข้อมูลให้แน่ใจว่าคุณลบออกจากยูทิลิตี้สำรวจนี้ไม่ได้ด้วยตนเอง


บิตนี้ฉันหนึ่งครั้งครั้งที่สองคือฉันมีการโยกย้ายอัตโนมัติ == FML ผิด
workabyte

8
นอกจากนี้ถ้าคุณไม่เห็นมัน เพียงเพิ่มการเชื่อมต่อใหม่และป้อน "(localdb) \ v11.0" (ด้วย Windows Auth) มันอาจดูเรียบง่าย แต่ฉันก็จ้องมองที่หน้าจอสักพัก :)
ปีเตอร์

@ ปีเตอร์โอเคเพิ่มฐานข้อมูลและตอนนี้ฉันเห็น 2 บริบทของฉัน เมื่อฉันลบจากมุมมองนี้ฉันได้รับข้อผิดพลาดใหม่: 'ไม่สามารถดึงระดับการเข้าถึงข้อมูลสำหรับฐานข้อมูลนี้' ฉันสามารถแก้ไขสิ่งนี้ได้โดยใช้ command prompt
nVentimiglia

1
เมื่อใช้โรงงานเชื่อมต่อเริ่มต้นของ EF6 คุณอาจใช้ mssqllocaldb แทน เปลี่ยนเซิร์ฟเวอร์เป็น (LocalDb) \ mssqllocaldb และดูว่าเชื่อมต่อหรือไม่ มี LocalDb หลายรุ่นและรุ่นหนึ่งไม่แสดงให้คุณเห็นทั้งหมด
Jim Yarbro

นอกจากนี้สิ่งที่ฉันมีประสบการณ์: คลิกที่ตัดการเชื่อมต่อแล้วเชื่อมต่ออีกครั้งหากคุณไม่เห็นฐานข้อมูลของคุณอีกต่อไป (รีเฟรชไม่ช่วย)
StefanG

19

ฉันลองใช้โซลูชันของ JSobell ก่อน แต่ไม่เห็นฐานข้อมูลของฉันอยู่ในรายการ ฉันเรียกใช้คำสั่งของ CodingWithSpike จาก VS Developer Command Prompt แต่นั่นก็ไม่ได้ผลเหมือนกัน ในที่สุดฉันก็รัน CodingWithSpike คำสั่งเดียวกันจาก Package Manager Console และใช้งานได้

    PM> sqllocaldb.exe stop v11.0
    LocalDB instance "v11.0" stopped.

    PM> 
    PM> sqllocaldb.exe delete v11.0
    LocalDB instance "v11.0" deleted.

    PM> sqllocaldb.exe start v11.0
    LocalDB instance "v11.0" started.

9

Alright

วิธีการแก้ปัญหาของฉันง่ายฉันเปลี่ยนไปใช้เซิร์ฟเวอร์ท้องถิ่น:

ฉันเปลี่ยนDataSourceคุณลักษณะในสตริงการเชื่อมต่อจาก:

Data Source=(LocalDb)\v11.0;blah

ถึง:

Data Source=.\SQLEXPRESS;blah

อีกวิธีคือเข้าสู่ LocalDb ผ่านทาง SQL Management Studio และลองลบฐานข้อมูลนั้น:

ป้อนคำอธิบายรูปภาพที่นี่

อย่างไรก็ตามมันใช้งานไม่ได้สำหรับฉันเมื่อฉันพยายามลบมันมีข้อความระบุว่า "TITLE: Microsoft SQL Server Management Studio

ฐานข้อมูล '{0}' ไม่มีอยู่บนเซิร์ฟเวอร์ (SqlManagerUI)

เมื่อฉันพยายามที่จะแยกออกฐานข้อมูลไม่ปรากฏในรายการสำหรับการเลือกแยก "ใช้ออฟไลน์" นำฉันไปสู่ข้อผิดพลาดด้านบน

ซึ่งทำให้ฉันคิดว่านี่เป็นข้อผิดพลาดที่มั่นคงใน LocalDB


ฉันมีปัญหาในการพยายามใช้ฐานข้อมูลท้องถิ่นกับ EF5
Nikos

LocalDB มีประโยชน์ที่คุณสามารถเรียกใช้ภายใต้บัญชีท้องถิ่นของคุณโดยไม่จำเป็นต้องมีสิทธิ์ระดับผู้ดูแลระบบเหมือนกับ IIS Express สิ่งนี้ทำให้สามารถแบ่งปันโครงการกับ devs จำนวนมากโดยไม่ต้องตั้งค่า IIS หรือ SQL Server สำหรับผู้ใช้แต่ละคน
Bart Verkoeijen

4

การแก้ไขที่ง่ายที่สุดคือเปลี่ยนชื่อฐานข้อมูลของคุณในสายอักขระการเชื่อมต่อ ดูบล็อก Rowan Millers วิธีการปล่อยฐานข้อมูลจาก Visual Studio 2012สำหรับโซลูชันทางเลือก เราหวังว่าจะแก้ไขปัญหานี้ในรุ่นอนาคต


2

คำตอบที่ดีที่สุดและง่ายฉันเพิ่งแก้ไขตอนนี้เพียงใช้ชื่อเซิร์ฟเวอร์ sql เป็นแหล่งข้อมูลแคตตาล็อกเริ่มต้นเป็นชื่อฐานข้อมูลของคุณและคุณไปเอาบรรทัด mdf


1

ในกรณีของฉันฉันใช้การย้ายข้อมูลและในการกำหนดค่าฉันเพียงแค่เปลี่ยนชื่อ dataContext และ dataContext คลาสของตัวเอง (เพิ่งเปลี่ยนชื่อ) จากนั้นลองอีกครั้งและช่วย


1

สำหรับ SQL 2014 โปรดทำตามคำตอบที่เลือก CodingWithSpike และความคิดเห็นนี้

จากหมายเหตุด้านข้าง v11.0 นั้นใช้เฉพาะกับ SQL LocalDB 2012 หากคุณใช้ LocalDB 2014 MS จะเปลี่ยนชื่อเป็นMSSqlLocalDbแทน - CodingWithSpike 29 ส.ค. 2557 เวลา 19:20 น


สังเกตด้านที่เป็นประโยชน์ผมพบนี้ทำงานในโครงการเก่าที่มี VS 2015 ข้อมูลเพิ่มเติม นอกจากนี้ยังมีการเปลี่ยนแปลงที่คล้ายกันใน VS 2013 จาก ไปv11.0 ProjectsV12อย่างน้อยในเครื่องของฉัน :-)
เล็ง

0

ฉันมีปัญหาเดียวกันและฉันแก้ไขมันด้วยตนเองโดยการตั้งค่าโฟลเดอร์ "DataDirectory" ไปยังโฟลเดอร์อื่นในไบนารีแอปของฉัน

ฉันใส่บรรทัดนี้ในวิธี Global.asax Application_Start:

AppDomain.CurrentDomain.SetData("DataDirectory", Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "App_Data"));

สตริงการเชื่อมต่อของฉันถูกตั้งค่าเป็นสิ่งนี้:

<connectionStrings>
    <add name="DataContext" connectionString="Data Source=(LocalDb)\v11.0; Initial Catalog=DataContext; Integrated Security=True; MultipleActiveResultSets=True; AttachDbFilename=|DataDirectory|DataContext.mdf"
  providerName="System.Data.SqlClient" />


ฉันไม่ได้ทดสอบ แต่สิ่งนี้อาจไม่ทำงาน เนื่องจากDataDirectoryมีการตั้งค่าเป็นApp_Dataค่าเริ่มต้นในเครื่องอยู่แล้วดังนั้นหากไม่มีการเปลี่ยนแปลงอย่างชัดเจนมาก่อนรหัสของคุณไม่ได้ทำอะไรเลย
Shimmy Weitzhandler

ถ้าคุณใช้วิธีนี้อย่าเปลี่ยนไดเรกทอรีเปลี่ยนชื่อไฟล์ MDF นอกจากนี้โปรดดูromiller.com/2013/05/17/…
RickAndMSFT

0

ฉันสามารถแก้ไขได้โดยเปลี่ยนชื่อ DataBase ในสตริงการเชื่อมต่อของฉันจากค่าเริ่มต้น aspnet- {numbers} เป็นชื่อธรรมดามันทำงานได้


0

เชื่อมต่อกับ (LocalDb) \ v11.0 โดยใช้สตูดิโอจัดการเซิร์ฟเวอร์ Sql ลบฐานข้อมูลจากนั้นทำการอัพเดทฐานข้อมูลในคอนโซลตัวจัดการแพ็คเกจ


0

ผมมีปัญหาเหมือนกัน. ฉันรันคำสั่งต่อไปนี้ในคอนโซลตัวจัดการแพคเกจและแก้ไขปัญหาได้

sqllocaldb.exe stop MSSqlLocalDb

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