ฉันมีวัตถุเฟรมเวิร์กเอนทิตีหนึ่งและเมื่อฉันเพิ่มลงในโครงการของฉันconnectionstring
ถูกเพิ่มไปยังapp.config
ในconnectionstring
ส่วน แต่เมื่อฉันต้องการสร้างใหม่entitycontext
และใช้สิ่งconnectionstring
นี้ข้อผิดพลาดนี้จะปรากฏขึ้น
ฉันมีวัตถุเฟรมเวิร์กเอนทิตีหนึ่งและเมื่อฉันเพิ่มลงในโครงการของฉันconnectionstring
ถูกเพิ่มไปยังapp.config
ในconnectionstring
ส่วน แต่เมื่อฉันต้องการสร้างใหม่entitycontext
และใช้สิ่งconnectionstring
นี้ข้อผิดพลาดนี้จะปรากฏขึ้น
คำตอบ:
ฉันสงสัยว่าปัญหาของคุณมาจากข้อเท็จจริงที่ว่าคุณมีโครงการมากกว่าหนึ่งโครงการในโซลูชันของคุณและโครงการที่มีเนื้อหาของเอนทิตีเฟรมเวิร์กรวมถึงedmx
ไฟล์ไม่ใช่โครงการเริ่มต้นของโซลูชัน ในกรณีนี้แม้ว่าสตริงการเชื่อมต่อจะมีอยู่ในapp.config
โครงการEF ยังคง CLR ไม่สามารถค้นหาได้ที่รันไทม์ ตัวอย่างเช่นหากคุณมีเว็บไซต์และโครงการ EF ในโซลูชันของคุณคุณต้องคัดลอกสตริงการเชื่อมต่อจากโครงการ EF app.config
ไปยังเว็บไซต์ของweb.config
คุณ โดยทั่วไปข้อมูลสตริงการเชื่อมต่อใด ๆ ควรมีอยู่ในไฟล์กำหนดค่าของโครงการที่เธรด. Net เริ่มต้นจากโดย CLR (เช่นโครงการเริ่มต้นของคุณ) หากนี่ไม่ใช่กรณีของคุณให้เปิดของคุณedmx
ไฟล์คลิกขวาบนพื้นผิวของมันเลือกคุณสมบัติและคัดลอกสตริงการเชื่อมต่อและวางไว้ในของคุณapp.config
สตริงการเชื่อมต่อ มาตรา. วิธีนี้คุณสามารถมั่นใจได้ว่าคุณมีสิ่งที่ถูกต้องในการกำหนดค่าของคุณ
แก้ไข:
อย่างที่คุณเห็นใน
Documenation บน ObjectContext Constructorพารามิเตอร์แรกคือชื่อ connectionstring ซึ่งเป็นรหัสที่สร้างขึ้นในเวลาที่คุณสร้าง EDM ของคุณ ถ้าอย่างใดชื่อของชื่อสายเชื่อมต่อของคุณมีการเปลี่ยนแปลงสิ่งที่คุณต้องทำคือคลิกขวาที่โมเดลของคุณและเลือก"อัปเดตโมเดลจากฐานข้อมูล ... " จากนั้นทำตามตัวช่วยสร้างเพื่ออัปเดต confing และผู้ออกแบบของคุณ เปลี่ยนแปลง
คุณต้องคัดลอกสตริงการเชื่อมต่อใน app.config ไปยัง web.config ของคุณหรือคัดลอกไฟล์ทั้งหมดไปยังโครงการที่แสดงผลลัพธ์ มันเป็นหนึ่งในเงื่อนไขที่ใช้เฟรมเวิร์ก
ฉันพบปัญหานี้เมื่อฉันพยายามวางตรรกะฐานข้อมูลที่กำหนดเองของฉันใน. dll เพื่อใช้งานหลายโครงการในโซลูชันของฉัน
ในขณะที่. dll มีไฟล์ app.config ที่ถูกต้อง แต่ก็ไม่ทำงาน เอนทิตีกรอบต้องการข้อมูลการเชื่อมต่อใน app.config ของ. exe การคัดลอกข้อมูลไปที่นั่นใช้ได้ดี
ทางออกของ Morteza ในการวางสายเชื่อมต่อลงใน. edmx ไม่ได้ผลสำหรับฉันเพราะมันจะไม่ให้ฉันวางค่าลงไปในนั้น - แม้ว่านั่นเป็นสิ่งที่ฉันต้องการจะทำ
สวัสดีฉันมีปัญหานี้และมันทำให้ฉันถั่ว อย่างไรก็ตามในที่สุดฉันก็พบว่าปัญหาคืออะไร สิ่งแรกที่คุณต้องทำคือตรวจสอบให้แน่ใจว่าconnectionstrings
ในapp.config
และweb.config
เป็นเหมือนกัน จากนั้นคุณต้องคลิกสองครั้งที่.edmx
ไฟล์เพื่อให้คุณสามารถดูตาราง เมื่อคุณคลิกที่ใดก็ได้ใกล้กับตาราง แต่ไม่ได้อยู่ในตารางและไปที่คุณสมบัติ จากรายการดรอปดาวน์เลือกConceptualEntityModel
และค้นหาชื่อคอนเทนเนอร์เอนทิตีและจดจำได้ดี
ถัดไปไปที่ผู้ออกแบบไฟล์ edmx และเปิดตัวสร้าง (ผู้ออกแบบเป็นโฟลเดอร์ย่อยของไฟล์ edmx) คอนสตรัคเตอร์ควรมีสองพารามิเตอร์ในพารามิเตอร์ BASE
public DBEntities() : base("name=DBEntities", "DBEntities")
{
this.ContextOptions.LazyLoadingEnabled = true;
OnContextCreated();
}
นี่คือหนึ่งในนั้น พารามิเตอร์แรกควรมีชื่อของไฟล์โครงการที่มี.edmx
ไฟล์นั้นพารามิเตอร์ที่สองจะต้องมีชื่อของชื่อคอนเทนเนอร์เอนทิตีจากคุณสมบัติที่ฉันกล่าวถึงก่อนหน้านี้เกี่ยวกับ อย่าลืมจัดเรียงคอนสตรัคเตอร์ทั้งหมดด้วย:base("", "")
อย่างน้อยนั่นก็เป็นปัญหาของฉันและปัญหาของฉันก็ถูกแก้ไขเช่นนั้น ฉันหวังว่าคุณจะแก้ปัญหาของคุณเช่นนี้
ฉันมีการเปลี่ยนแปลงในเรื่องนี้ที่ดูเหมือนจะไม่มีใครครอบคลุม
ฉันมีโครงการหลักที่มีโมเดลสองแบบและโครงการทดสอบที่มีการทดสอบหน่วย โครงการทดสอบกำลังทำงาน แต่จากนั้นหยุดด้วยข้อผิดพลาดที่กล่าวถึงใน OP ฉันไม่ได้เปลี่ยนชื่อหรือย้ายไฟล์ EDMX
คำแนะนำมากมายที่กล่าวถึงการเปรียบเทียบไฟล์. config แต่โครงการของฉันไม่มีเลย
ในที่สุดฉันก็คัดลอกไฟล์ app.config จากโครงการหลักไปยังโครงการทดสอบของฉันแล้วก็ใช้งานได้ ไม่ว่าจะเป็นขั้นตอนที่ถูกต้องหรือจะนำเสนอปัญหาการบำรุงรักษาเมื่อมีการเพิ่มรุ่นอื่น ๆ ฉันไม่ทราบ แต่อย่างน้อยตอนนี้การทดสอบหน่วยของฉันทำงานอย่างถูกต้องอีกครั้งในขณะนี้
แม้ว่าคำตอบของ 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 ของโครงการเริ่มต้นของคุณซึ่งอย่างน้อยในกรณีของฉันก็ไม่เป็นที่ต้องการ
ฉันลืมเพิ่ม ProviderName = "System.Data.EntityClient" เป็นแอตทริบิวต์ในสตริงการเชื่อมต่อ ซึ่งส่งผลให้เกิดข้อผิดพลาดนี้ดังนั้น
<add name="connectionName" connectionString="metadata=res://*/..." providerName="System.Data.EntityClient" />
แทน
<add name="connectionName" connectionString="metadata=res://*/..." />
ฉันเพิ่งพบว่าหากแอปถูกสร้างใน IIS จาก VS2010 สองระดับจากรูทเว็บไซต์ข้อผิดพลาดนี้จะเกิดขึ้น ไม่แน่ใจว่าทำไมมันเกิดขึ้นจะต้องตรวจสอบเพิ่มเติม ตัวอย่างเช่นหากแอปของคุณอยู่ในเส้นทางนี้/admin/advertiser
ข้อผิดพลาดจะปรากฏขึ้นหากคุณไม่มี/admin
ไดเรกทอรีเสมือนในไซต์ IIS ของคุณ
สิ่งที่ฉันทำคือสร้างadmin
ไดเรกทอรีว่างในตัวฉัน.../intepub/wwwroot
ข้อผิดพลาดหายไป
คุณจะพบว่าคุณจะไม่สามารถเริ่มต้นการดีบักจนกว่าคุณจะทำตามขั้นตอนข้างต้น
เรามีปัญหานี้ในทีมของเราในอดีตมันใช้เวลาพอสมควรในการจำ แต่นี่เป็นวิธีที่เราแก้ไขก่อนหน้านี้เช่นกัน
ฉันใช้สถาปัตยกรรม n'tier และมีปัญหาเดียวกัน แต่อันนี้ช่วยฉันได้สิ่งนี้จะช่วยคุณได้ ครั้งแรกที่คุณมีเหมือนกันconnection string
กับคุณlibraries
ที่คุณสามารถเข้าถึงฐานข้อมูลเหมือนในapp.config
และweb.config
หลังจากนั้นคุณก็เพิ่มตัวสร้างมากเกินไปในไฟล์. edmx (Model.context.cs) ที่ตอนนี้คุณมีสองคอนสตรัคเตอร์เป็นค่าเริ่มต้นและอีกหนึ่งคุณเพิ่งเพิ่ม มากเกินไป)
public YourEntityName(string connString)
: base(connString)
{
}
ฉันมีห้องสมุดเรียนที่ไม่ต้องการทำงานกับ EF หลังจากที่ฉันคัดลอก app.config (หรือเพียงแค่ส่วนการเชื่อมต่อ) จากไลบรารีคลาสของฉันไปยังโครงการ exe การเชื่อมต่อใช้งานได้ดี! อาจเป็นไปได้ว่าไฟล์กำหนดค่าจะอยู่ในโฟลเดอร์เดียวกันกับโครงการ exe และไม่พบ ดังนั้นควรระมัดระวังเป็นพิเศษเมื่อใช้ไฟล์กำหนดค่าในโครงการไลบรารีคลาส!
อืม ... ปัญหานี้อาจเป็นเพราะเหตุผลง่ายๆ (โง่) ... ฉันคัดลอกไฟล์จากโครงการอื่นและลืมเปลี่ยน ConnectionString บน EntityDataSource ... เพราะฉันเป็นจุดเริ่มต้นของโครงการและเกิดขึ้น ในหน้าเข้าสู่ระบบฉันคิดว่ามันเป็นสิ่งที่เกี่ยวกับการตั้งค่า แต่เป็นเพียงชื่อสตริงการเชื่อมต่อที่ไม่ถูกต้อง (และ DefaultContainerName)