Tidak bisakah nama tabel yang sama dalam model kerangka entitas yang berbeda?

Aplikasi saya menggunakan dua database SQL 2008 yang berbeda. Basis data memiliki beberapa tabel dengan nama yang sama, mis. Users. Saya ingin menggunakan EF4 untuk kedua database ini. Namun, ketika saya menjalankan aplikasi saya dan mengenai pembuatan konteks objek dari database kedua, saya mendapatkan kesalahan berikut:

Beberapa tipe dengan nama 'Pengguna' ada di EdmItemCollection di ruang nama yang berbeda. Pemetaan berbasis konvensi memerlukan nama unik tanpa memperhatikan namespace di EdmItemCollectionto namespace di EdmItemCollection

Apakah ini berarti saya tidak bisa menggunakan dua database dengan (sebagian) nama tabel yang sama dalam aplikasi yang sama? Mereka berada di namespace berbeda, model edmx berbeda, proyek berbeda, dll.

P.S. Salah satu model dibuat oleh desainer dan menggunakan kelas POCO, sedangkan model lainnya disimpulkan dari database dan digabungkan erat dengan EF.


person Carvellis    schedule 01.11.2010    source sumber
comment
Akankah mengubah nama entitas salah satunya di Perancang menyelesaikan masalah ini? Namun hal itu tampaknya sedikit merepotkan.   -  person Andrew Barber    schedule 01.11.2010
comment
Saya mengharapkan solusi yang berbeda. Ini adalah aplikasi konversi database (dari database lama ke database baru) jadi ada beberapa nama tabel yang sama. Selain berakhir dengan nama tipe yang salah, mengganti nama mereka di desainer berarti melakukan pemfaktoran ulang yang serius pada aplikasi baru.   -  person Carvellis    schedule 01.11.2010
comment
Saya memiliki masalah yang sama dengan nama entitas yang berbeda...   -  person juanora    schedule 25.11.2016


Jawaban (5)


Kesalahannya berarti, seperti yang dikatakannya: Anda tidak dapat menggunakan pemetaan berbasis konvensi default dalam skenario Anda. Gunakan pemetaan basis data khusus sebagai gantinya. Scott Guthrie memiliki item blog terperinci tentang ini.

person Dirk Brockhaus    schedule 03.11.2010

Untuk menggunakan "pemetaan berbasis konvensi default", 2 pendekatan berikut akan berfungsi:

1) Tabrakan disebabkan oleh string koneksi yang menggunakan wild card:

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

Karena * tidak mengerjakan proyek Anda, Anda dapat menentukan beberapa string koneksi ke kode keras rakitan yang berisi edmx.

2) membuat pembantu

    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);
    }

Pembaruan 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
Ini cukup banyak membantu saya. Saya memodifikasi templat T4 saya untuk mengimplementasikan sesuatu seperti itu sehingga semua model dapat menggunakan satu string koneksi dari konfigurasi tetapi masih dapat membaca metadatanya saja. Terima kasih. - person juhan_h; 19.05.2011
comment
Saya baru saja mendapat suara positif dan ingin memperbarui ini... Jangan baru EntityConnection, jika tidak, Anda perlu mengatur pembukaan/penutupan objek. Pembantu Anda sebaiknya mengembalikan connectionstring sebagai string dan menggunakan konstruktor kelebihan beban pada konteks objek ef4.0 atau dbcontext ef4.1. - person Leblanc Meneses; 06.01.2012
comment
+1 untuk solusi sederhana yang juga berfungsi tanpa Kode Pertama. - person christoph; 30.10.2013
comment
Saya sudah membuat beberapa string koneksi, tetapi tidak menghilangkan wildcard... Bagaimana cara menghilangkan wildcard? - person juanora; 25.11.2016
comment
Saya tahu ini adalah pertanyaan lama, tetapi bisakah seseorang memberi tahu saya cara menggunakan metode ekstensi di atas? Selain itu, saya menggunakan EF6, bukan 4. Misalnya, kode yang dihasilkan dbContext saya memanggil DbContext .ctor dengan nama=string, jadi saya harus memodifikasinya secara manual dengan kelebihan beban .ctor yang mengambil string koneksi? - person Trober; 31.01.2017
comment
Apakah solusi ini berhasil untuk siapa pun? Dan bisakah jawaban ini diperluas untuk menyertakan contoh implementasi? - person Nugs; 22.08.2017

Saya memiliki masalah yang sama, tetapi solusi saya adalah menghapus DLL MODEL\edmx dari proyek, karena disalin dari proyek lain, dan kemudian membangunnya kembali. Selesaikan semuanya!

person user3728728    schedule 27.06.2016

Alasan lain untuk kesalahan itu adalah apa yang terjadi pada saya: Proyek saya disalin dari tempat lain dan saya mengganti nama proyek tersebut, jadi setelah kompilasi ada 2 DLL di folder bin saya. Yang dari proyek sebelumnya dan yang baru, diberi nama sesuai dengan proyek baru. Setelah saya menghapus DLL sebelumnya/lama, ambiguitas namespace hilang dan kesalahan hilang.

person Juan    schedule 10.05.2018

Untuk pendekatan DB pertama, Untungnya ada beberapa solusi yang cukup mudah:

  1. Pastikan kedua konteks tidak berbagi tabel dengan nama yang sama - bukan pendekatan yang paling praktis.
  2. Restrukturisasi solusi dengan mengisolasi konteks database dalam rakitannya sendiri.

Untuk detail selengkapnya, lihat tautan

Dijelaskan dengan sangat jelas.

person George    schedule 26.11.2018