MetadataException: ไม่สามารถโหลดทรัพยากร metadata ที่ระบุได้


681

ทั้งหมดในทันทีที่ฉันให้ได้รับMetadataExceptionในอินสแตนซ์ของฉันสร้างObjectContextระดับ สตริงการเชื่อมต่อใน App.Config ดูถูกต้อง - ยังไม่เปลี่ยนตั้งแต่ใช้งานล่าสุด - และฉันได้ลองสร้างโมเดลใหม่ (ไฟล์ edmx) จากฐานข้อมูลพื้นฐานโดยไม่มีการเปลี่ยนแปลง

ใครมีความคิดเห็นบ้าง

รายละเอียดเพิ่มเติม: ฉันยังไม่ได้เปลี่ยนคุณสมบัติใด ๆ ฉันยังไม่ได้เปลี่ยนชื่อของชุดประกอบเอาต์พุตใด ๆ ฉันไม่ได้พยายามฝัง EDMX ในชุดประกอบ ฉันรอเพียง 10 ชั่วโมงจากการออกจากงานจนกว่าฉันจะกลับมา แล้วมันก็ไม่ทำงานอีกต่อไป

ฉันพยายามสร้าง EDMX ใหม่ ฉันพยายามสร้างโครงการใหม่ ฉันยังพยายามสร้างฐานข้อมูลใหม่ตั้งแต่เริ่มต้น ไม่มีโชค แต่อย่างใด


14
หากคำถามเกี่ยวกับผลิตภัณฑ์เฉพาะที่มีการดูเกิน 200k แสดงว่าผลิตภัณฑ์ไม่ทำงานตามที่ผู้ใช้คาดหวัง ฉันต้องการจะดูที่อยู่ Microsoft นี้ นี่คือการเชื่อมโยงที่จะให้คำแนะนำพวกเขาหากคุณมีเวลา: visualstudio.uservoice.com/forums/121579-visual-studio
Tony L.

ปัญหาของฉันแก้ไขได้โดยแทนที่การเชื่อมต่อสตริงคัดลอกจากโครงการ db-layer
Hardik

คำตอบ:


857

ซึ่งหมายความว่าแอปพลิเคชันไม่สามารถโหลด EDMX มีหลายสิ่งที่สามารถทำให้เกิดสิ่งนี้

  • คุณอาจเปลี่ยนคุณสมบัติ MetadataArtifactProcessing ของโมเดลเป็น Copy to Output Directory
  • สายอักขระการเชื่อมต่ออาจผิด ฉันรู้ว่าคุณบอกว่าคุณยังไม่ได้เปลี่ยน แต่ถ้าคุณเปลี่ยนสิ่งอื่น ๆ (พูดชื่อของการชุมนุม) มันอาจจะผิด
  • คุณอาจกำลังใช้งานโพสต์คอมไพล์เพื่อฝัง EDMX ในชุดประกอบซึ่งใช้งานไม่ได้ด้วยเหตุผลบางประการ

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

ปรับปรุง:ฉันได้เขียนบล็อกโพสต์ด้วยขั้นตอนที่สมบูรณ์มากขึ้นสำหรับการแก้ไขปัญหา


70
ConnectionString แม้จะมีความพยายามของฉันที่จะเปรียบเทียบกับยูทิลิตี้ครั้งสุดท้ายเนื้อหาเปรียบเทียบเป็นผิด
J. Steen

16
มันเป็นสายเชื่อมต่อสำหรับฉันด้วย เมื่อคุณมี Integration Tests ที่ต้องการการเชื่อมต่อใน App.config ของตัวเองสิ่งต่าง ๆ อาจไม่ตรงกันเมื่อคุณอัปเดต edmx ของคุณ
เรย์

11
ตกลงฉันแก้ไขโดยเพียงตั้ง "ฝัง"; การคอมไพล์จากนั้นทำการรีเซ็ตไปที่อีกอัน นั่นช่วยแก้ไขปัญหาของฉัน
Shimmy Weitzhandler

6
มีปัญหาเดียวกันลองวิธีแก้ปัญหาของคุณต้องการให้ +1 รู้ว่าฉันเคยทำมาแล้วในอดีต ฉันจำไม่ได้ว่าเคยเจอปัญหานี้มาก่อน) ในกรณีของฉันมันเป็นสตริงการเชื่อมต่อที่ถูกต้องใน Class Library ที่มี edmx และไม่ถูกต้องในเว็บแอปพลิเคชันเมื่อมีการใช้งาน
Episodex

9
คู่มือที่ยอดเยี่ยม สำหรับฉันฉันจะคัดลอกสตริงการเชื่อมต่ออื่นที่ใช้ res: // * / Database.MyModel2 ... เมื่อฉันต้องการ res: // * / MyModel1 ... (ฐานข้อมูลเป็นโฟลเดอร์ในโครงการ Integration Tests ของฉัน)
emragins

361

การเปลี่ยนแปลงเล็กน้อยนี้ช่วยแก้ไขปัญหานี้

ฉันมีทางออกสำหรับ 3 โครงการ

connectionString="metadata=res://*/Model.Project.csdl|res://*/Model.Project.ssdl|res://*/Model.Project.msl;

เปลี่ยนไป

connectionString="metadata=res://*/;

11
มันซ่อมให้ฉัน แต่มันหมายถึงอะไร
แลนซ์ฟิชเชอร์

18
@ Lance: ฉันอธิบายรายละเอียดในโพสต์บล็อกนี้
Craig Stuntz

4
@ jocull: ไม่มันจะไม่ทำงานในหลายกรณีและจะช้าในคนอื่น ๆ อ่านโพสต์บล็อกของฉันเพื่อทำความเข้าใจว่าทำไม
Craig Stuntz

6
ย้าย. edmx ของฉันไปที่โฟลเดอร์รุ่นแล้วลืมอัปเดตสตริงการเชื่อมต่อ ตัวชี้ที่ยอดเยี่ยม ขอบคุณ คงใช้เวลาหลายชั่วโมงในการคิดออก
muruge

11
คุณช่วยให้พนักงาน Microsoft ที่ยากจนจากผู้บริโภคที่โกรธแค้นมาก
มัฟฟินแมน

115

คุณสามารถรับข้อยกเว้นนี้ได้เมื่อ Edmx อยู่ในโครงการหนึ่งและคุณใช้งานจากโครงการอื่น

เหตุผลคือRes://*/uri ซึ่งชี้ไปที่ทรัพยากรในแอสเซมบลีปัจจุบัน หากมีการกำหนด Edm ในแอสเซมบลีที่แตกต่างจากรหัสที่ใช้อยู่ res: // * / จะไม่ทำงานเนื่องจากไม่พบทรัพยากร

แทนที่จะระบุ '*' คุณจะต้องระบุชื่อเต็มของชุดประกอบแทน (รวมถึงโทเค็นกุญแจสาธารณะ) เช่น:

res://YourDataAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=abcdefabcedf/YourEdmxFileName.csdl|res://...

วิธีที่ดีกว่าในการสร้างสตริงการเชื่อมต่อกับ EntityConnectionStringBuilder:

public static string GetSqlCeConnectionString(string fileName)
{
    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlServerCe.3.5";
    csBuilder.ProviderConnectionString = string.Format("Data Source={0};", fileName);

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName);

    return csBuilder.ToString();
}

public static string GetSqlConnectionString(string serverName, string databaseName)
{
    SqlConnectionStringBuilder providerCs = new SqlConnectionStringBuilder();

    providerCs.DataSource = serverName;
    providerCs.InitialCatalog = databaseName;
    providerCs.IntegratedSecurity = true;

    var csBuilder = new EntityConnectionStringBuilder();

    csBuilder.Provider = "System.Data.SqlClient";
    csBuilder.ProviderConnectionString = providerCs.ToString();

    csBuilder.Metadata = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl",
        typeof(YourObjectContextType).Assembly.FullName);

    return csBuilder.ToString();
}

หากคุณยังคงพบข้อยกเว้นให้เปิดชุดประกอบในตัวสะท้อนสัญญาณและตรวจสอบชื่อไฟล์สำหรับไฟล์. csdl, .ssdl และ. msl เมื่อทรัพยากรมีชื่อแตกต่างกันไปตามที่ระบุในค่าเมทาดาทามันจะไม่ทำงาน


8
โปรดพิจารณาว่า "YourEdmxFileName" ต้องเป็นชื่อที่ผ่านการรับรองเช่น "YourNamespace.YourEdmxFileName" หากคุณใช้เนมสเปซในแอสเซมบลีของคุณ อย่างไรก็ตามคุณต้องลบส่วนของเนมสเปซที่เท่ากับชื่อของแอสเซมบลีของคุณ
Marcel

5
MSDN กล่าวว่าย่อหน้าที่สองผิด "เมื่อคุณใช้ wildcard (*) Entity Framework จะต้องตรวจสอบชุดประกอบทั้งหมดสำหรับทรัพยากรที่มีชื่อที่ถูกต้อง"
Craig Stuntz

ฉันค่อนข้างแน่ใจว่าเนมสเปซไม่เกี่ยวข้อง แต่เส้นทางของไฟล์ที่ฝังอยู่ ดังนั้นแม้ว่าคุณจะตรวจสอบไฟล์ * .Designer.cs ของไฟล์ edmx ที่เกี่ยวข้องและแจ้งให้ทราบว่าเนมสเปซคลาสที่สร้างขึ้นอัตโนมัติคือ MyCompany ... ไม่ว่าอะไรก็ตามมันไม่ใช่สิ่งที่คุณควรใช้ พา ธ คือชื่อแอสเซมบลี, ชื่อโซลูชัน / ชื่อไฟล์ ตัวอย่างเช่น: "metadata = res: // * / EntityModels. <filename> .csdl |" + "res: // * / EntityModels. <filename> .ssdl |" + "res: // * / EntityModels. <filename> .msl;"
Daniel

1
@Daniel นั้นถูกต้องส่วนใหญ่ แต่โปรดทราบว่าบางครั้งเนมสเปซและพา ธ ไฟล์ที่ฝังจะบางครั้งเหมือนกัน คุณต้องดูด้วย Reflector (หรือทางเลือกฟรี) เพื่อให้แน่ใจ
Craig Stuntz

ดูเหมือนว่าจะใช้งานได้เฉพาะชื่อแอสเซมบลีที่ไม่มีเวอร์ชั่น publickeytoken ฯลฯ ไลค์:res://MyAssembly/folder.<filename>.csdl...
Ivan Ferrer Villa

67

ฉันมีข้อผิดพลาดที่คล้ายกัน ฉันสร้างโครงการขึ้นใหม่ (เรื่องยาว) และดึงทุกอย่างมาจากโครงการเก่า ฉันไม่ได้ตระหนักว่าแบบจำลองของฉันเคยอยู่ในไดเรกทอรีชื่อ 'รุ่น' มาก่อนและตอนนี้อยู่ในไดเรกทอรีที่เรียกว่า 'แบบจำลอง' เมื่อฉันเปลี่ยนการเชื่อมต่อใน Web.Config จากนี้:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Model.Recipe.csdl 

สำหรับสิ่งนี้:

<add name="RecipeManagerEntities" connectionString="metadata=res://*/Models.Recipe.csdl

ทุกอย่างทำงาน (เปลี่ยนModelเป็นModels) โปรดทราบว่าฉันต้องเปลี่ยนสถานที่ทั้งสามนี้ในสายนี้


2
ฉันย้ายโมเดล Entity Framework จาก Model เป็น DAL แต่เมื่อฉันเขียนการทดสอบ (หนึ่งสัปดาห์ต่อมา) ในโครงการทดสอบเพื่อทดสอบตัวสร้างสถานะของ Linq ฉันได้รับข้อผิดพลาดนี้ ฉันแก้ไข App.config โครงการทดสอบด้วยวิธีที่มันดูใน web.config ของโครงการหลัก - ดังที่คุณพูดในสามแห่ง ดังนั้นคำตอบง่ายๆของคุณทำให้ฉันติดตาม
Patrik Lindström

ใช่ขอบคุณ - ตรวจสอบชื่อไฟล์ของคุณ อย่างใดฉันมีชื่อเก่า
PeterX

7
มีความแตกต่างระหว่างสองคนนี้ไหม!
Erwin Rooijakkers

2
@ErwinRooijakkers Model vs ModelS
Marc

คิดว่าฉันทำแบบเดียวกันหลังจากอ่านบล็อกของ Craig แต่ +1 สำหรับการเรียนรู้เป็นสิ่งสำคัญที่ต้องจำไว้ว่าการเปลี่ยนแปลงที่เกิดขึ้นในไลบรารีคลาส "เอนทิตี" ของคุณไม่ได้ทำโดยอัตโนมัติในไฟล์กำหนดค่าของโครงการที่อ้างอิง / ถอนหายใจดีใจที่ฉันไม่ได้อยู่คนเดียว
ruffin

26

และวิธีที่รวดเร็วในการตรวจสอบชื่อรุ่นโดยไม่มี Reflector .... ให้มองหาไดเรกทอรี

... obj / {config output} / edmxResourcesToEmbed

และตรวจสอบว่ามีไฟล์ทรัพยากร. csdl, .msl และ. ssdl หากอยู่ในไดเร็กทอรีย่อยชื่อของไดเร็กทอรีย่อยจะต้องต่อท้ายกับชื่อโมเดล

ตัวอย่างเช่นไฟล์ทรัพยากรสามไฟล์ของฉันอยู่ในข้อมูลไดเรกทอรีย่อยดังนั้นสตริงการเชื่อมต่อของฉันจะต้องเป็น

metadata = res: // * / Data .MyModel.csdl | res: // * / Data .MyModel.ssdl | res: // * / Data .MyModel.msl;

(กับ metadata = res: //*/MyModel.csdl | res: //*/MyModel.ssdl | res: //*/MyModel.msl;)


นี่คือปัญหาของฉันแน่นอน แพ้หลายชั่วโมงในเรื่องนี้ ขอบคุณมากสำหรับคำอธิบายง่ายๆนี้
Fernando Carvalhosa

คำตอบที่ดีจริง ๆ แล้วอธิบายวิธีค้นหาสตริงของคุณ และแสดงให้เห็นว่าโฟลเดอร์ย่อยมี '.' เป็นตัวคั่นและไม่ใช่ '\' หรือ '/'
cjb110

16

ฉันยังมีปัญหานี้และเป็นเพราะการเชื่อมต่อสายอักขระใน web.config ของฉันแตกต่างจากแอปในแอปพลิเคชั่นการตั้งค่าที่ฉันติดตั้ง EDMX ของฉันเล็กน้อย ไม่รู้เลยว่าทำไมมันถึงเปลี่ยนแปลง แต่นี่คือสองเวอร์ชั่นที่แตกต่างกัน

app.config:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SMCSModel.csdl|res://*/Model.SMCSModel.ssdl|res://*/Model.SMCSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;multipleactiveresultsets=True;application name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Web.config:

<add name="SCMSEntities" connectionString="metadata=res://*/Model.SCMSModel.csdl|res://*/Model.SCMSModel.ssdl|res://*/Model.SCMSModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=SANDIEGO\sql2008;initial catalog=SCMS;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

สิ่งที่แก้ไขคือการคัดลอกสตริง app.config (สังเกตเห็นความแตกต่างเล็ก ๆ ในตอนท้าย - แทนที่จะเป็น " App=EntityFramework" มันต้องการ " application name=EntityFramework") ลงใน web.config และปัญหาได้รับการแก้ไข :)


1
ขอบคุณนี่เป็นปัญหาของฉัน ฉันมี 1 โครงการที่เข้าถึง DB กับ EF และ WCF โครงการอื่น หลังจากเปลี่ยนชื่อโครงการแรกแล้ว connectionString ก็เปลี่ยนไปใน App.config ของโครงการแรกของฉัน ดังนั้นผมจึงต้องเปลี่ยน ConnectionString ในโครงการ WCF เช่นกันในการ web.config :)
วอ

จากเอกสาร MSDN เกี่ยวกับdocs.microsoft.com/en-us/dotnet/framework/data/adonet/ … : The .NET Framework data provider for SQL Server (SqlClient) supports many keywords from older APIs, but is generally more flexible and accepts synonyms for many of the common connection string keywords.สตริงการเชื่อมต่อ Entity Framework ไม่ได้ใช้ความยืดหยุ่นนั้นดังนั้นคุณต้องใช้คำหลักที่คาดหวังเท่านั้น
Suncat2000

13

สิ่งนี้เกิดขึ้นกับฉันเมื่อฉันเผลอเปลี่ยน Build Action ของไฟล์ edmx (ปรากฏภายใต้ Properties ใน IDE) จาก 'EntityDeploy' เป็น 'None' EntityDeploy คือสิ่งที่เติมข้อมูลเมตาให้คุณ: ดูhttp://msdn.microsoft.com/en-us/library/cc982037.aspx


นี่คือการแก้ไขของฉัน - ฉันเปลี่ยนชื่อ edmx เป็น. old เมื่อฉันคัดลอกมันและพยายามทำบางสิ่งออกไปหลังจากนั้นเมื่อฉันเปลี่ยนชื่อกลับเป็น Build Action ตั้งค่าด้วยตนเองเป็น none ดังนั้นจึงได้รับข้อผิดพลาดนี้ ปัญหาของฉัน :)
eth0

ฉันย้ายไฟล์ EDMX ของฉันไปยังโฟลเดอร์อื่นและต้องเปลี่ยนการดำเนินการสร้างเพื่อให้ชื่อทรัพยากรในตัวได้รับการอัพเดตเช่นกัน ขอบคุณ!
เดวิด

นี่คือทางออกสำหรับฉัน ฉันทำการตั้งค่านั้นหายไปในระหว่างการอัพเกรดเป็น. NET Standard ขอบคุณที่ช่วยสติของฉัน!
NetherGranite

11

สิ่งนี้เกิดขึ้นกับฉันเมื่อฉันไม่ล้างโซลูชันก่อนสร้างตัวออกแบบ. edmx ใหม่ ดังนั้นอย่าลืมทำความสะอาดโซลูชันก่อนที่คุณจะสร้างนักออกแบบ. edmx ใหม่ สิ่งนี้ช่วยให้ฉันข้ามปัญหาอื่น ๆ ได้มากขึ้นด้วยอันนี้ ตะโกนรายละเอียดการนำทางหากคุณยังใหม่กับ visual studio

คลิก -> Build-> Clean Solution

จากนั้นคลิก -> สร้าง -> สร้างโซลูชันใหม่

หวังว่านี่จะช่วยได้ ขอบคุณทุกคน


8

ฉันเพิ่งใช้เวลา 30 นาทีกับสิ่งนี้ ฉันเปลี่ยนชื่อวัตถุเอนทิตีเปลี่ยนชื่อรายการในไฟล์กำหนดค่า แต่มีมากกว่า ... คุณต้องเปลี่ยนการอ้างอิงไปยัง csdl เช่นกัน

ง่ายมากที่จะพลาด - ถ้าคุณเปลี่ยนชื่อให้แน่ใจว่าคุณได้รับทุกอย่าง ....


6

ผมมีปัญหาเดียวกัน. ฉันค้นหา dll ที่สอดคล้องกับตัวสะท้อนแสงและได้เห็นว่าชื่อของทรัพยากรไม่ถูกต้อง ฉันเปลี่ยนชื่อแล้วและมันก็ดูดีในตอนนี้


6

สำหรับกรณีของฉันมันจะแก้ไขได้โดยการเปลี่ยนคุณสมบัติของไฟล์ edmx

  1. เปิดไฟล์ edmx
  2. คลิกขวาที่ที่ของ EDMX Designer
  3. เลือกคุณสมบัติ
  4. อัปเดตคุณสมบัติที่เรียกว่า "การประมวลผลสิ่งประดิษฐ์ของข้อมูลเมตา" เป็น "ฝังในแอสเซมบลีเอาท์พุท"

สิ่งนี้แก้ปัญหาให้ฉันได้ ปัญหาคือเมื่อคอนเทนเนอร์พยายามค้นหาข้อมูลเมตามันไม่สามารถค้นหาได้ ดังนั้นเพียงแค่ทำให้มันอยู่ในการชุมนุมเดียวกัน วิธีนี้จะไม่ทำงานหากคุณมีไฟล์ edmx ในชุดประกอบอื่น


+1,000,000 นี่เป็นปัญหาพื้นฐานสำหรับฉันในวันนี้ ความพยายามในการจัดระเบียบเนมสเปซของผลิตภัณฑ์ใหม่และการรวมแอสเซมบลี
Mike

6

ฉันใช้เวลาทั้งวันกับข้อผิดพลาดนี้

หากคุณกำลังทำงานกับ n-tear architecture

หรือคุณพยายามseparate Modelsสร้างโดยEDMXฟอร์ม DataAccessLayer ถึงDomainModelLayer

บางทีคุณจะได้รับข้อผิดพลาดนี้

  1. ขั้นตอนการแก้ไขปัญหาเบื้องต้นคือการตรวจสอบให้แน่ใจว่าสตริงการเชื่อมต่ออยู่webconfig (UILayer)และappconfig (DataAccessLayer)เหมือนกัน
  2. ข้อสองซึ่งสำคัญมาก connection string

    connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provid.....

    ซึ่งเป็นปัญหา

ฉันได้จากที่ไหนในโลกModelหรืออะไรก็ตาม. csdl ในสตริงการเชื่อมต่อของพวกเขาอยู่ที่ไหน

ที่นี่ฉันวิธีการแก้ปัญหาของเราดูภาพ

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

หวังว่าจะช่วยคุณ


5

ฉันสามารถแก้ไขปัญหานี้ใน Visual Studio 2010, VB.net (ASP.NET) 4.0

ระหว่างตัวช่วยสร้างโมเดลเอนทิตีคุณจะสามารถเห็นสตริงการเชื่อมต่อเอนทิตี จากที่นั่นคุณสามารถคัดลอกและวางลงในสตริงการเชื่อมต่อของคุณ

สิ่งเดียวที่ฉันหายไปคือ "App_Code" ในสตริงการเชื่อมต่อ

entityBuilder.Metadata = "res://*/App_Code.Model.csdl|res://*/App_Code.Model.ssdl|res://*/App_Code.Model.msl"

น่าเสียดายที่สตริงการเชื่อมต่อในตัวช่วยสร้างไม่ถูกต้องสำหรับ app.config @leqid แนะนำวิธีที่ดีในการแก้ไขพา ธ ไปยังโมเดล
Der_Meister

5

หลังจากผ่านไปหลายชั่วโมงของ googling และพยายามที่จะแก้ปัญหาใด ๆ ที่แนะนำไม่ทำงาน ฉันได้แสดงรายการวิธีแก้ปัญหาต่าง ๆ ที่นี่ ฉันยังสังเกตเห็นคนที่ทำงานให้ฉันด้วย (ฉันใช้ EF เวอร์ชัน 6.1.1 และ SQL Server 2014 - แต่เป็น DB ที่เก่ากว่า)

  1. สร้างโครงการใหม่แล้วลองอีกครั้ง
  2. ปิดและเปิด VS - ฉันไม่รู้ว่ามันทำงานอย่างไร
  3. ตรวจสอบให้แน่ใจว่าคุณได้วางไฟล์. EDMX ไว้ในไดเรกทอรีหรือไม่ตรวจสอบให้แน่ใจว่าคุณใส่ไดเรกทอรีใน ConnectionString ของคุณ ตัวอย่างเช่น mine อยู่ในโฟลเดอร์ DAL ดังนั้นจึงมีลักษณะดังนี้: connectionString="metadata=res://*/DAL.nameModel.csdl|res://*/DAL.nameModel.ssdl|res://*/DAL.nameModel.msl;(นี่คือไฟล์หากต้องการดูพวกเขาคุณสามารถสลับแสดงไฟล์ทั้งหมดในโซลูชัน explorer ภายใต้ไดเรกทอรี ~ / obj / .. )

... และอีกมากมายที่ฉันได้ลอง [เช่น: เปลี่ยนเวอร์ชัน EntityFramework เป็นเวอร์ชันใหม่กว่า (ไม่แน่ใจเกี่ยวกับมัน)]


สิ่งที่ทำงานให้ฉัน:

จากบทความนี้ที่นี่มันช่วยฉันแก้ปัญหาของฉัน ฉันเพิ่งเปลี่ยนฉันProviderManifestToken="2012"ไปProviderManifestToken="2008"ในแฟ้ม EDMX เพื่อทำสิ่งนี้:

Solution Explorer

  1. คลิกขวาที่ไฟล์. edmx
  2. เปิดด้วย..
  3. บรรณาธิการ XML
  4. เปลี่ยน ProviderManifestToken = "XXXX" ด้วย 2008

ฉันหวังว่าจะช่วย


ฉันเพิ่งมีปัญหานี้หลังจากที่ดูเหมือนจะไม่มีการเปลี่ยนแปลง พยายามเริ่มต้น VS ใหม่จนไม่มีประโยชน์ แต่หลังจากนั้นก็แก้ไขได้โดยการทำความสะอาดและสร้างใหม่ ดังนั้นสำหรับคนอื่น ๆ หากคุณไม่ทำการเปลี่ยนแปลงใด ๆ และส่วนที่เหลือทั้งหมดนี้ไม่เกี่ยวข้องเลยให้ลองสร้างใหม่อีกครั้ง
เกร็ก

5

หากคุณใช้ edmx จากโครงการอื่นจากนั้นในสตริงการเชื่อมต่อเปลี่ยน ...

metadata=res://*/Data.DataModel.csdl

...ถึง...

metadata=res://*/DataModel.csdl

สิ่งนี้เป็นจริงหากคุณต้องการย้ายไปยังโฟลเดอร์ย่อยโปรเจ็กต์ใหม่คุณต้องเพิ่มfolder.subfolderก่อน
qakmak

ขอบคุณโซลูชันนี้ใช้งานได้สำหรับฉัน ฉันย้ายไฟล์. edmx ของฉันจาก dir ในโปรเจ็กต์หนึ่งไปยังรูทของโปรเจ็กต์อื่นและต้องการลบชื่อ dir ออกจากสตริงการเชื่อมต่อทั้งหมดในโซลูชันของฉัน
Chris

4

ทางออกที่ดีที่สุด (แม้หลังจากสร้างฐานข้อมูลบนเครื่องอื่นสองเครื่องรวมถึง EDMX และของกระจุกกระจิกอื่น ๆ ) ก็ไม่ควรใช้ Entity Framework รุ่นแรก รอคอยที่จะประเมินมันอีกครั้งใน. NET 4.0

หลังจากพบปัญหาเดียวกันอีกครั้งและค้นหาคำตอบทั้งหมดในที่สุดฉันก็พบคนที่มีปัญหาเดียวกัน ปรากฏว่าสตริงการเชื่อมต่อไม่ได้สร้างขึ้นอย่างถูกต้องโดยตัวช่วยสร้างของ Visual Studio และการเชื่อมโยงไปยังทรัพยากรเมตาดาต้านั้นขาดเส้นทางที่สำคัญ

v1.0 BUG ?: ไม่สามารถโหลดทรัพยากรเมตาดาต้าที่ระบุได้ สคริปต์! = แบบจำลอง

อัปเดต 2013-01-16 : การเปลี่ยนผ่านไปเป็นเกือบเฉพาะโดยใช้แนวทางปฏิบัติของ EF Code First (แม้จะมีฐานข้อมูลที่มีอยู่แล้ว) ปัญหานี้ก็ไม่มีปัญหาอีกต่อไป สำหรับฉันนั่นเป็นวิธีแก้ปัญหาที่ใช้งานได้เพื่อลดความยุ่งเหยิงจากรหัสที่สร้างขึ้นโดยอัตโนมัติและการกำหนดค่าและเพิ่มการควบคุมผลิตภัณฑ์ของฉันเอง


4

ปัญหาและวิธีแก้ไขของฉันอาการเหมือนกันคือ "ไม่สามารถโหลดทรัพยากรเมตาดาต้าที่ระบุ" แต่สาเหตุที่แตกต่างกัน ฉันมี 2 โครงการในโซลูชันหนึ่งคือ EntityModel และอีกโซลูชัน ฉันลบและสร้างไฟล์ EDMX ใหม่ใน EntityModel

ทางออกคือฉันต้องกลับไปที่โครงการ Web Application และเพิ่มบรรทัดนี้ลงในไฟล์ปรับแต่ง โมเดลใหม่มีการเปลี่ยนแปลงบางรายการซึ่งจะต้องทำซ้ำในไฟล์ Web.Config ของโครงการ "อื่น ๆ " การกำหนดค่าเก่าไม่ดีอีกต่อไป

     <add name="MyEntities"
     connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;
                    provider=System.Data.SqlClient;
                    provider connection string=&quot;
                    data source=Q\DEV15;initial catalog=whatever;
                    user id=myuserid;password=mypassword;
                    multipleactiveresultsets=True;
                    application name=EntityFramework&quot;"
     providerName="System.Data.EntityClient" />

4

บางครั้งฉันเห็นข้อผิดพลาดนี้ในโครงการของฉัน ฉันแก้มันโดย

1 - คลิกขวาที่ไฟล์ EDMX

2 - เลือกRun Custom Toolตัวเลือก

3 - สร้างโครงการใหม่


สิ่งนี้ใช้ได้กับฉัน แต่ฉันต้องสร้างใหม่ในภายหลัง
rdans

3

ในกรณีของฉันปัญหานี้เกี่ยวข้องกับการเปลี่ยนชื่อไฟล์ edmx ของรุ่นของฉัน ... แก้ไขสตริงการเชื่อมต่อ app.config สำหรับไฟล์ csdl / ssdl / msl เพื่อแก้ไขปัญหาของฉัน

หากคุณใช้นักออกแบบ EF 4.0 เพื่อสร้าง csdl / ssdl / msl ของคุณไฟล์ "3" เหล่านี้จะถูกจัดเก็บไว้ในไฟล์ edmx หลักของแบบจำลอง ในกรณีนี้โพสต์ของ Waqas นั้นค่อนข้างติดเครื่องหมาย สิ่งสำคัญคือต้องเข้าใจว่า "Model_Name" ในตัวอย่างของเขาจะต้องเปลี่ยนเป็นชื่อปัจจุบันของไฟล์. edmx ของรุ่นของคุณ (โดยไม่มี. edmx)

นอกจากนี้หากไฟล์ edmx ของคุณไม่ได้อยู่ในระดับรูทของโปรเจคคุณจะต้องนำหน้า Model_Name พร้อมกับพา ธ สัมพัทธ์เช่น

res://*/MyModel.WidgetModel.csdl|res://*/MyModel.WidgetModel.ssdl|res://*/MyModel.WidgetModel.msl

จะระบุ csdl / ssdl / msl xml ถูกเก็บไว้ในไฟล์ model 'WidgetModel.edmx' ซึ่งถูกเก็บไว้ในโฟลเดอร์ที่ชื่อว่า 'MyModel'


3

ฉันได้เขียนคลาสตัวช่วยนี้เพื่อสร้างอินสแตนซ์ของออบเจ็กต์ ObjectContext เมื่อมีการกำหนดไว้ในโครงการที่แตกต่างจากโครงการที่ใช้ ฉันแยกสตริงการเชื่อมต่อในไฟล์ config และแทนที่ '*' ด้วยชื่อชุดประกอบเต็ม

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

หวังว่าจะช่วยใครซักคน

public static class EntityHelper<T> where T : ObjectContext
{
    public static T CreateInstance()
    {
        // get the connection string from config file
        string connectionString = ConfigurationManager.ConnectionStrings[typeof(T).Name].ConnectionString;

        // parse the connection string
        var csBuilder = new EntityConnectionStringBuilder(connectionString);

        // replace * by the full name of the containing assembly
        csBuilder.Metadata = csBuilder.Metadata.Replace(
            "res://*/",
            string.Format("res://{0}/", typeof(T).Assembly.FullName));

        // return the object
        return Activator.CreateInstance(typeof(T), csBuilder.ToString()) as T;
    }
}

3

สำหรับคุณทุกคน SelftrackingEntitiesผู้ใช้ถ้าคุณได้ติดตาม Microsoft Walk-through และแยกคลาสบริบทของ Object เป็นโครงการบริการ wcf (โดยเชื่อมโยงกับบริบท. tt) ดังนั้นคำตอบนี้เหมาะสำหรับคุณ:

ส่วนหนึ่งของคำตอบที่แสดงในโพสต์นี้ที่มีรหัสเช่น:

... = string.Format("res://{0}/YourEdmxFileName.csdl|res://{0}/YourEdmxFileName.ssdl|res://{0}/YourEdmxFileName.msl", 
        typeof(YourObjectContextType).Assembly.FullName); 

จะไม่ทำงานให้คุณ !! เหตุผลก็คือYourObjectContextType.Assemblyตอนนี้อยู่ใน Assembley ที่แตกต่างกัน (ภายใน wcf project assembly)

ดังนั้นคุณควรแทนที่YourObjectContextType.Assembly.FullName ด้วย ->

ClassTypeThatResidesInEdmProject.Assembly.FullName 

มีความสุข.


2

ฉันมีปัญหากับข้อความแสดงข้อผิดพลาดเดียวกันนี้ ปัญหาของฉันได้รับการแก้ไขโดยการปิดและเปิด Visual Studio 2010 อีกครั้ง


2

มีปัญหาเดียวกันเพราะฉันเปลี่ยนชื่อชุดประกอบ

ฉันต้องเปลี่ยนชื่อใน AssemblyTitle และแอตทริบิวต์ AssemblyProduct ในโครงการ Properties / AssemblyInfo.cs และลบและเพิ่มการอ้างอิงไปยังไฟล์ edmx อีกครั้ง

จากนั้นก็ใช้งานได้ดี


2

ด้วยปัญหาเดียวกันฉันสร้าง edmx ใหม่จากฐานข้อมูล แก้ปัญหาของฉัน


2
น่าเสียดายที่ที่อยู่และปฏิบัติต่ออาการไม่ใช่สาเหตุ
Clarice Bouwer

2

มีข้อยกเว้นเนื่องจากคอมไพเลอร์ชี้ไปที่เมทาดาทาที่ไม่มีอยู่ดังนั้นเพียงคัดลอกapp.config connectionstring ไปที่Web.configConnectionString


1

ฉันยังมีปัญหาและวิธีแก้ปัญหาแบบเดียวกับ Rick ยกเว้นว่าฉันกำลังนำเข้า. edmx ที่มีอยู่ไปยังโครงการใหม่และในขณะที่ namespace พื้นฐานไม่สำคัญว่ามันจะถูกนำเข้าสู่ไดเรกทอรีย่อยอื่นดังนั้นฉันจึงต้องอัปเดตการเชื่อมต่อ สตริงภายใน Web.Config ในสามแห่งเพื่อรวมการตั้งชื่อไดเรกทอรีย่อยที่แตกต่างกัน:


1

ฉันมีปัญหาเดียวกันกับโซลูชันที่มีโครงการใน Solution Folder เมื่อพวกเขาถูกย้ายไปยัง Solution Root (เพื่อที่จะเอาชนะข้อผิดพลาดที่น่าสงสัยกับ Mvc3AppConverter เนื่องจากที่ตั้งโครงการ)

แม้ว่าโซลูชันจะรวบรวมหลังจากเพิ่มการอ้างอิงโครงการทั้งหมดอีกครั้งตามต้องการ แต่ข้อผิดพลาดเกิดขึ้นเมื่อเว็บไซต์เริ่มทำงาน

EDMX อยู่ในหนึ่งในโครงการที่ถูกย้าย (โครงการ 'ข้อมูล') แต่แน่นอนว่าการขาดการอ้างอิงไปยังโครงการ Data นั้นไม่ได้ทำให้เกิดข้อผิดพลาดในการคอมไพล์

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

ฉันหวังว่านี่จะช่วยคนอื่นได้


1

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

ก่อนที่ฉันจะแก้ไขสตริงการเชื่อมต่อทั้งสองที่แยกกันให้เหมือนกันฉันยังพบว่าข้อผิดพลาดด้านล่าง

Unable to load the specified metadata resource

ดังนั้นฉันจึงต้องเป็นสายเชื่อมต่อเดียวกันสำหรับสองชั้น (DAL, UI) มันทำงานได้อย่างสมบูรณ์แบบ

โซลูชันของฉันคือทำให้สตริงการเชื่อมต่อทั้งหมดเป็นเหมือนกันไม่ว่าพวกเขาจะนำเสนอที่ไหน


1

ฉันมีปัญหานี้เมื่อวานนี้และดูรหัสของฉันในการแก้ปัญหาและผลลัพธ์จาก SQL Profiler

สิ่งที่ฉันไม่เข้าใจก่อนที่ฉันจะอ่านและทำความเข้าใจกับโพสต์นี้คือสาเหตุที่ EntityFramework ขว้างข้อผิดพลาดนี้ขณะที่เรียก DB ฉันดูผ่านหลายร้อยบรรทัดใน SQL Profiler พยายามหาสิ่งที่ผิดกับตัวแบบฐานข้อมูล ฉันไม่พบสิ่งใดจากการโทรที่ฉันคาดหวังและบอกตามตรงว่าฉันไม่แน่ใจในสิ่งที่ฉันต้องการ

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

ตรวจสอบให้แน่ใจว่าชื่อถูกต้อง เมื่อฉันได้รับการแยกออกฉันก็เห็นสายใน SQL Profiler ที่ ApplicationName เป็น 'EntityFramework' ด้วย SQL เรียกตารางที่คาดหวัง


1

ไฟล์ app.config หรือ web.config ที่ไม่ดีสามารถทำได้ .. ฉันได้คัดลอกสตริงการเชื่อมต่อ app.config ไปยัง web.config ของฉันใน UI ของฉันและสิ้นสุดการป้อน:

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