ไม่สามารถมีชื่อตารางเดียวกันในโมเดลเฟรมเวิร์กเอนทิตีที่แตกต่างกันได้ใช่ไหม

แอปพลิเคชันของฉันใช้ฐานข้อมูล SQL 2008 สองฐานข้อมูลที่แตกต่างกัน ฐานข้อมูลมีตารางสองสามตารางที่มีชื่อเหมือนกัน เช่น Users. ฉันต้องการใช้ EF4 สำหรับฐานข้อมูลทั้งสองนี้ อย่างไรก็ตาม เมื่อฉันรันแอปพลิเคชันและพบการสร้าง objectcontext ของฐานข้อมูลที่สอง ฉันได้รับข้อผิดพลาดต่อไปนี้:

มีหลายประเภทที่มีชื่อ 'ผู้ใช้' ใน EdmItemCollection ในเนมสเปซที่ต่างกัน การแมปตามแบบแผนต้องใช้ชื่อที่ไม่ซ้ำกันโดยไม่คำนึงถึงเนมสเปซใน EdmItemCollection ถึงเนมสเปซใน EdmItemCollection

นี่หมายความว่าฉันไม่สามารถใช้สองฐานข้อมูลที่มีชื่อตารางเดียวกัน (บางส่วน) ในแอปพลิเคชันเดียวกันได้หรือไม่ พวกเขาอยู่ในเนมสเปซที่แตกต่างกัน โมเดล edmx ที่แตกต่างกัน โปรเจ็กต์ที่แตกต่างกัน ฯลฯ

ป.ล. หนึ่งในโมเดลนี้สร้างขึ้นโดยนักออกแบบและใช้คลาส POCO และอีกโมเดลหนึ่งอนุมานจากฐานข้อมูลและเชื่อมโยงกับ EF อย่างแน่นหนา


person Carvellis    schedule 01.11.2010    source แหล่งที่มา
comment
การเปลี่ยนชื่อเอนทิตีของหนึ่งในนั้นในตัวออกแบบจะแก้ปัญหานี้หรือไม่ ดูเหมือนว่าจะไม่สะดวกสักหน่อย   -  person Andrew Barber    schedule 01.11.2010
comment
ฉันหวังว่าจะมีวิธีแก้ปัญหาที่แตกต่างออกไป นี่คือแอปแปลงฐานข้อมูล (จากฐานข้อมูลเดิมไปเป็นฐานข้อมูลใหม่) ดังนั้นจึงมีชื่อตารางหลายชื่อเหมือนกัน นอกจากจะลงเอยด้วยชื่อประเภทที่ไม่ถูกต้องแล้ว การเปลี่ยนชื่อในตัวออกแบบยังหมายถึงการปรับโครงสร้างใหม่อย่างจริงจังในแอปพลิเคชันใหม่   -  person Carvellis    schedule 01.11.2010
comment
ฉันประสบปัญหาเดียวกันกับชื่อเอนทิตีที่แตกต่างกัน...   -  person juanora    schedule 25.11.2016


คำตอบ (5)


ข้อผิดพลาดหมายถึงสิ่งที่เขากล่าวไว้: คุณไม่สามารถใช้การแมปตามแบบแผนเริ่มต้นในสถานการณ์ของคุณได้ ใช้ การแมปฐานข้อมูลแบบกำหนดเอง แทน Scott Guthrie มีรายการบล็อกโดยละเอียดเกี่ยวกับ สิ่งนี้

person Dirk Brockhaus    schedule 03.11.2010

หากต้องการใช้ "การแมปตามแบบแผนเริ่มต้น" จะใช้ 2 วิธีต่อไปนี้:

1) การชนกันเกิดจากสตริงการเชื่อมต่อโดยใช้ไวด์การ์ด:

    metadata=res://*/Repositories.EntityFramework.Model.csdl|res://*/Repositories.EntityFramework.Model.ssdl|res://*/Repositories.EntityFramework.Model.msl;

เนื่องจาก * ใช้ไม่ได้กับโปรเจ็กต์ของคุณ คุณจึงสามารถกำหนดสตริงการเชื่อมต่อหลายรายการเพื่อฮาร์ดโค้ดชุดประกอบที่มี edmx ได้

2) สร้างตัวช่วย

    public static EntityConnection GetEfConnectionString(this string sqlConnectionString)
    {
        var cs = string.Format(@"metadata=res://{0}/Repositories.EntityFramework.Model.csdl|res://{0}/Repositories.EntityFramework.Model.ssdl|res://{0}/Repositories.EntityFramework.Model.msl;provider=System.Data.SqlClient;provider connection string=""" + sqlConnectionString + @"""",
            Assembly.GetCallingAssembly().FullName
        );

        return new EntityConnection(cs);
    }

อัปเดต 2017:

    public static string GetEfConnectionString(this string sqlConnectionString, Type type)
    {
        string cs =
            string.Format(
                @"metadata=res://{0}/Models.Model.csdl|res://{0}/Models.Model.ssdl|res://{0}/Models.Model.msl;provider=System.Data.SqlClient;provider connection string=""" +
                sqlConnectionString + @"""",
                type.Assembly.FullName
                );
        return cs;
    }


    // usage: don't "new" EntityConnection.  See 2012 comment.
    string connString = ConfigurationManager.ConnectionStrings["sqlConnection"].ConnectionString.GetEfConnectionString();
    using(var entities = new XyzEntities(connString))
person Leblanc Meneses    schedule 15.05.2011
comment
สิ่งนี้ช่วยฉันได้มากทีเดียว ฉันดัดแปลงเทมเพลต T4 ของฉันเพื่อใช้งานบางอย่างเพื่อให้ทุกรุ่นสามารถใช้สตริงการเชื่อมต่อเดียวจาก config แต่ยังคงสามารถอ่านได้เฉพาะข้อมูลเมตาเท่านั้น ขอบคุณ. - person juhan_h; 19.05.2011
comment
ฉันเพิ่งได้รับการโหวตและต้องการอัปเดตสิ่งนี้ ... อย่าสร้าง EntityConnection ใหม่ ไม่เช่นนั้นคุณต้องจัดการการเปิด / ปิดวัตถุ ผู้ช่วยของคุณควรส่งคืนสตริงการเชื่อมต่อเป็นสตริงแทน และใช้ตัวสร้างโอเวอร์โหลดบน objectcontext ef4.0 หรือ dbcontext ef4.1 - person Leblanc Meneses; 06.01.2012
comment
+1 สำหรับโซลูชันที่ง่ายกว่าซึ่งทำงานได้โดยไม่ต้องใช้ Code First เช่นกัน - person christoph; 30.10.2013
comment
ฉันสร้างสตริงการเชื่อมต่อหลายรายการแล้ว แต่ไม่ได้กำจัดไวด์การ์ด... ฉันจะกำจัดไวด์การ์ดได้อย่างไร - person juanora; 25.11.2016
comment
ฉันรู้ว่านี่เป็นคำถามเก่า แต่มีใครช่วยบอกวิธีใช้วิธีการขยายข้างต้นได้ไหม นอกจากนี้ ฉันใช้ EF6 ไม่ใช่ 4 ตัวอย่างเช่น โค้ดที่สร้าง dbContext ของฉันเรียก DbContext .ctor ด้วย name=string ดังนั้นฉันจะต้องแก้ไขด้วยตนเองโดยใช้ .ctor โอเวอร์โหลดโดยใช้สตริงการเชื่อมต่อหรือไม่ - person Trober; 31.01.2017
comment
โซลูชันนี้ใช้ได้กับทุกคนหรือไม่ และคำตอบนี้สามารถขยายเพื่อรวมตัวอย่างการใช้งานได้หรือไม่ - person Nugs; 22.08.2017

ฉันมีปัญหาเดียวกัน แต่วิธีแก้ปัญหาของฉันคือการลบ DLL ของ MODEL\edmx ออกจากโปรเจ็กต์ เนื่องจากมันถูกคัดลอกมาจากโปรเจ็กต์อื่น แล้วสร้างใหม่ แก้ปัญหาทุกอย่าง!

person user3728728    schedule 27.06.2016

อีกสาเหตุหนึ่งของข้อผิดพลาดนั้นคือสิ่งที่เกิดขึ้นกับฉัน: โปรเจ็กต์ของฉันถูกคัดลอกมาจากที่อื่นและฉันเปลี่ยนชื่อโปรเจ็กต์ ดังนั้นหลังจากคอมไพล์แล้วก็มี DLL 2 ตัวอยู่ในโฟลเดอร์ bin ของฉัน อันจากโปรเจ็กต์ที่แล้วและอันใหม่ตั้งชื่อตามโปรเจ็กต์ใหม่ เมื่อฉันลบ DLL ก่อนหน้า/เก่า ความคลุมเครือของเนมสเปซก็หายไปและข้อผิดพลาดก็หายไป

person Juan    schedule 10.05.2018

สำหรับแนวทางแรกของ DB โชคดีที่มีวิธีแก้ไขปัญหาสองสามอย่างที่ค่อนข้างตรงไปตรงมา:

  1. ตรวจสอบให้แน่ใจว่าบริบททั้งสองไม่ได้ใช้ตารางที่มีชื่อเดียวกันร่วมกัน - ไม่ใช่แนวทางที่ใช้งานได้จริงที่สุด
  2. ปรับโครงสร้างโซลูชันใหม่โดยแยกบริบทฐานข้อมูลภายในแอสเซมบลีของตนเอง

สำหรับรายละเอียดเพิ่มเติม โปรดดูที่ลิงก์

อธิบายได้ชัดเจนมาก.

person George    schedule 26.11.2018