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


170

ฉันมีวัตถุเฟรมเวิร์กเอนทิตีหนึ่งและเมื่อฉันเพิ่มลงในโครงการของฉันconnectionstring ถูกเพิ่มไปยังapp.configในconnectionstringส่วน แต่เมื่อฉันต้องการสร้างใหม่entitycontextและใช้สิ่งconnectionstringนี้ข้อผิดพลาดนี้จะปรากฏขึ้น



4
ขอบคุณสำหรับลิงค์เครก ฉันลงคะแนนเพื่อเก็บเธรดนี้ไว้เนื่องจากชื่อเป็นสิ่งที่ช่วยให้ฉันพบข้อผิดพลาดของ MetadataException
jp2code

สิ่งนี้เกิดขึ้นกับฉันเมื่อไฟล์กำหนดค่าไม่ได้อัปเดตด้วยสตริงการเชื่อมต่อด้วยเหตุผลแปลก ๆ
P.Brian.Mackey

คำตอบ:


217

ฉันสงสัยว่าปัญหาของคุณมาจากข้อเท็จจริงที่ว่าคุณมีโครงการมากกว่าหนึ่งโครงการในโซลูชันของคุณและโครงการที่มีเนื้อหาของเอนทิตีเฟรมเวิร์กรวมถึงedmxไฟล์ไม่ใช่โครงการเริ่มต้นของโซลูชัน ในกรณีนี้แม้ว่าสตริงการเชื่อมต่อจะมีอยู่ในapp.configโครงการEF ยังคง CLR ไม่สามารถค้นหาได้ที่รันไทม์ ตัวอย่างเช่นหากคุณมีเว็บไซต์และโครงการ EF ในโซลูชันของคุณคุณต้องคัดลอกสตริงการเชื่อมต่อจากโครงการ EF app.configไปยังเว็บไซต์ของweb.configคุณ โดยทั่วไปข้อมูลสตริงการเชื่อมต่อใด ๆ ควรมีอยู่ในไฟล์กำหนดค่าของโครงการที่เธรด. Net เริ่มต้นจากโดย CLR (เช่นโครงการเริ่มต้นของคุณ) หากนี่ไม่ใช่กรณีของคุณให้เปิดของคุณedmxไฟล์คลิกขวาบนพื้นผิวของมันเลือกคุณสมบัติและคัดลอกสตริงการเชื่อมต่อและวางไว้ในของคุณapp.configสตริงการเชื่อมต่อ มาตรา. วิธีนี้คุณสามารถมั่นใจได้ว่าคุณมีสิ่งที่ถูกต้องในการกำหนดค่าของคุณ

แก้ไข:
อย่างที่คุณเห็นใน Documenation บน ObjectContext Constructorพารามิเตอร์แรกคือชื่อ connectionstring ซึ่งเป็นรหัสที่สร้างขึ้นในเวลาที่คุณสร้าง EDM ของคุณ ถ้าอย่างใดชื่อของชื่อสายเชื่อมต่อของคุณมีการเปลี่ยนแปลงสิ่งที่คุณต้องทำคือคลิกขวาที่โมเดลของคุณและเลือก"อัปเดตโมเดลจากฐานข้อมูล ... " จากนั้นทำตามตัวช่วยสร้างเพื่ออัปเดต confing และผู้ออกแบบของคุณ เปลี่ยนแปลง


1
สวัสดี Morteza และขอบคุณสำหรับคำตอบของคุณ แต่ก่อนหน้านี้ฉันคัดลอก connectionstring sectin ใน web.config แต่ข้อผิดพลาดไม่ได้รับการแก้ไข แต่เมื่ออยู่ใน )) เล็กน้อยการเชื่อมต่อสตริงนี้ทำงาน idae ใด ๆ
user421413

1
@Morteza คุณมีทางออกสำหรับโครงการที่แอสเซมบลีการดำเนินการไม่มี app.config หรือไม่ ในกรณีของฉันการเรียกใช้งานได้คือแอป VB6 ที่เรียกแอสเซมบลีของฉัน (ซึ่งมีเอนทิตีวัตถุ) ผ่าน COM Interop
เน่าเสียง่าย Dave

4
เรียบง่าย แต่น่าผิดหวังมาก ขึ้น VOTE Long stackoverflow ที่ยาวนาน!
granadaCoder

3
หากคุณใช้ WCF อย่าลืมใส่สายเชื่อมต่อในโครงการบริการของคุณ
นาธาน

1
ขอบคุณ Morteza ช่วยฉันประหยัดเวลาได้มาก!
Chris

32

คุณต้องคัดลอกสตริงการเชื่อมต่อใน app.config ไปยัง web.config ของคุณหรือคัดลอกไฟล์ทั้งหมดไปยังโครงการที่แสดงผลลัพธ์ มันเป็นหนึ่งในเงื่อนไขที่ใช้เฟรมเวิร์ก


1
เพียงแค่เพิ่มสตริงการเชื่อมต่อเดียวกัน (เช่นเดียวกับใน Data access project) ใน web.config ของคุณ (พบในโครงการส่วนหน้า)
ภาษาเดนมาร์ก

@ Musikero31 ฉันใช้ EF และกำหนดสตริงการเชื่อมต่อเอนทิตีทั้งหมดในรหัส ฉันไม่มีอะไรในการกำหนดค่าที่เกี่ยวข้องกับมัน
Keith Beard

หลังจากฉันคัดลอกไฟล์ DAL ไปยังโครงการใหม่ฉันได้รับข้อผิดพลาดด้านบนเช่นกัน เมื่อมองเข้าไปใกล้ไฟล์ปรับแต่งผมสังเกตเห็นว่าสตริงการเชื่อมต่อถูกแทนที่ด้วย EF ฉันสามารถคัดลอก / วางสตริงการเชื่อมต่อที่ถูกต้องด้วยตนเองลงในโครงการใหม่และทำงานได้
Ravi Ram

9

ฉันพบปัญหานี้เมื่อฉันพยายามวางตรรกะฐานข้อมูลที่กำหนดเองของฉันใน. dll เพื่อใช้งานหลายโครงการในโซลูชันของฉัน

ในขณะที่. dll มีไฟล์ app.config ที่ถูกต้อง แต่ก็ไม่ทำงาน เอนทิตีกรอบต้องการข้อมูลการเชื่อมต่อใน app.config ของ. exe การคัดลอกข้อมูลไปที่นั่นใช้ได้ดี

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


3
แม้ว่าจะมีเพียง app.config (และเป็นไฟล์ config ในไดเรกทอรีนั้นเท่านั้น) ในไดเรกทอรีของ exe ของฉันมันจะไม่อ่าน ฉันต้องเปลี่ยนชื่อไฟล์ myExe.exe.config
Mario

6

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

ถัดไปไปที่ผู้ออกแบบไฟล์ edmx และเปิดตัวสร้าง (ผู้ออกแบบเป็นโฟลเดอร์ย่อยของไฟล์ edmx) คอนสตรัคเตอร์ควรมีสองพารามิเตอร์ในพารามิเตอร์ BASE

public DBEntities() : base("name=DBEntities", "DBEntities")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

นี่คือหนึ่งในนั้น พารามิเตอร์แรกควรมีชื่อของไฟล์โครงการที่มี.edmxไฟล์นั้นพารามิเตอร์ที่สองจะต้องมีชื่อของชื่อคอนเทนเนอร์เอนทิตีจากคุณสมบัติที่ฉันกล่าวถึงก่อนหน้านี้เกี่ยวกับ อย่าลืมจัดเรียงคอนสตรัคเตอร์ทั้งหมดด้วย:base("", "")

อย่างน้อยนั่นก็เป็นปัญหาของฉันและปัญหาของฉันก็ถูกแก้ไขเช่นนั้น ฉันหวังว่าคุณจะแก้ปัญหาของคุณเช่นนี้


6

ฉันมีการเปลี่ยนแปลงในเรื่องนี้ที่ดูเหมือนจะไม่มีใครครอบคลุม

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

คำแนะนำมากมายที่กล่าวถึงการเปรียบเทียบไฟล์. config แต่โครงการของฉันไม่มีเลย

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


ตั้งแต่ฉันโพสต์สิ่งนี้ฉันรู้ว่าคงเป็นการดีที่สุดที่จะสร้างลิงก์ไปยังไฟล์ app.config ของโครงการอื่น แต่ยังคงวิธีการอื่นจะทำงานเพื่อแก้ไขปัญหาเดิมเมื่อไม่มีไฟล์กำหนดค่าเลย
S. Baggy

4

แม้ว่าคำตอบของ Morteza Manaviจะช่วยแก้ปัญหานี้ได้ แต่อีกวิธีหนึ่งคือการสร้างสตริงการเชื่อมต่อแบบไดนามิกและส่งต่อไปยัง Constructor สำหรับ ObjectContext ของคุณ:

public static string CreateConnectionString()
{
    var assemblyPath = Assembly.GetExecutingAssembly().Location;
    string assemblyLocation = Path.GetDirectoryName(assemblyPath);
    string dbPath = Path.Combine(assemblyLocation, "YourDatabase.sdf");
    var sqlBuilder = new SqlConnectionStringBuilder { DataSource = dbPath };

    var entityBuilder = new EntityConnectionStringBuilder
    {
        ProviderConnectionString = sqlBuilder.ConnectionString,
        Provider = "System.Data.SqlServerCe.3.5",
        Metadata = @"res://*/YourModel.csdl|
                 res://*/YourModel.ssdl|
                 res://*/YourModel.msl"
    };

    return entityBuilder.ToString();
}

// Snip...

var entityContext = new YourObjectContext(CreateConnectionString());

สิ่งนี้ไม่จำเป็นต้องคัดลอกข้อมูลสตริงการเชื่อมต่อไปยัง app.config ของโครงการเริ่มต้นของคุณซึ่งอย่างน้อยในกรณีของฉันก็ไม่เป็นที่ต้องการ


4

ฉันลืมเพิ่ม ProviderName = "System.Data.EntityClient" เป็นแอตทริบิวต์ในสตริงการเชื่อมต่อ ซึ่งส่งผลให้เกิดข้อผิดพลาดนี้ดังนั้น

<add name="connectionName" connectionString="metadata=res://*/..." providerName="System.Data.EntityClient" />

แทน

<add name="connectionName" connectionString="metadata=res://*/..." />

2

ฉันเพิ่งพบว่าหากแอปถูกสร้างใน IIS จาก VS2010 สองระดับจากรูทเว็บไซต์ข้อผิดพลาดนี้จะเกิดขึ้น ไม่แน่ใจว่าทำไมมันเกิดขึ้นจะต้องตรวจสอบเพิ่มเติม ตัวอย่างเช่นหากแอปของคุณอยู่ในเส้นทางนี้/admin/advertiserข้อผิดพลาดจะปรากฏขึ้นหากคุณไม่มี/adminไดเรกทอรีเสมือนในไซต์ IIS ของคุณ

สิ่งที่ฉันทำคือสร้างadminไดเรกทอรีว่างในตัวฉัน.../intepub/wwwrootข้อผิดพลาดหายไป

คุณจะพบว่าคุณจะไม่สามารถเริ่มต้นการดีบักจนกว่าคุณจะทำตามขั้นตอนข้างต้น

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


1

ฉันใช้สถาปัตยกรรม n'tier และมีปัญหาเดียวกัน แต่อันนี้ช่วยฉันได้สิ่งนี้จะช่วยคุณได้ ครั้งแรกที่คุณมีเหมือนกันconnection stringกับคุณlibrariesที่คุณสามารถเข้าถึงฐานข้อมูลเหมือนในapp.configและweb.config หลังจากนั้นคุณก็เพิ่มตัวสร้างมากเกินไปในไฟล์. edmx (Model.context.cs) ที่ตอนนี้คุณมีสองคอนสตรัคเตอร์เป็นค่าเริ่มต้นและอีกหนึ่งคุณเพิ่งเพิ่ม มากเกินไป)

        public YourEntityName(string connString)
            : base(connString)
        {
        }

1

ฉันมีห้องสมุดเรียนที่ไม่ต้องการทำงานกับ EF หลังจากที่ฉันคัดลอก app.config (หรือเพียงแค่ส่วนการเชื่อมต่อ) จากไลบรารีคลาสของฉันไปยังโครงการ exe การเชื่อมต่อใช้งานได้ดี! อาจเป็นไปได้ว่าไฟล์กำหนดค่าจะอยู่ในโฟลเดอร์เดียวกันกับโครงการ exe และไม่พบ ดังนั้นควรระมัดระวังเป็นพิเศษเมื่อใช้ไฟล์กำหนดค่าในโครงการไลบรารีคลาส!


0

อืม ... ปัญหานี้อาจเป็นเพราะเหตุผลง่ายๆ (โง่) ... ฉันคัดลอกไฟล์จากโครงการอื่นและลืมเปลี่ยน ConnectionString บน EntityDataSource ... เพราะฉันเป็นจุดเริ่มต้นของโครงการและเกิดขึ้น ในหน้าเข้าสู่ระบบฉันคิดว่ามันเป็นสิ่งที่เกี่ยวกับการตั้งค่า แต่เป็นเพียงชื่อสตริงการเชื่อมต่อที่ไม่ถูกต้อง (และ DefaultContainerName)

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