wake-up-neo.net

Die Zuordnung des CLR-Typs zum EDM-Typ ist bei EF 6 & 5 mehrdeutig.

Kann mir jemand helfen, diesen Fehler zu beheben?

Das angegebene Schema ist nicht gültig. Fehler: 

Die Zuordnung des CLR-Typs zum EDM-Typ ist mehrdeutig, da mehrere CLR-Typen mit dem EDM-Typ 'City_DAL' übereinstimmen. Zuvor gefundener CLR-Typ 'CeossDAL.City_DAL', neu gefundener CLR-Typ 'CeossBLL.City_DAL'.

Das Hauptproblem, dass ich DAL habe und dies enthält die EF und BLL und diese enthält dieselben Klassen der DAL, unterscheiden sich jedoch im Namensraum und dies ist das, was das Problem verursacht

Ich kann nicht wissen, wie ich dieses Problem lösen kann. Können Sie mir bitte helfen?

Ich würde mich auch freuen, wenn mir jemand Beispiele für die Verwendung der n-Tier-Architektur mit EF gibt

Vielen Dank 

62
Mahmoud Samir

Verwenden Sie keine Klassen mit demselben nicht qualifizierten name - EF verwendet nur Klassennamen, um den in EDMX zugeordneten Typ zu identifizieren (Namespaces werden ignoriert). Es ist eine Konvention, die das Zuordnen von Klassen aus verschiedenen Namespaces zu einem einzelnen Modell zulässt. Die Lösung für Ihr Problem besteht darin, Ihre Klassen in BLL anders zu benennen.

73
Ladislav Mrnka

Workaround: Ändern Sie eine Eigenschaft in einer der beiden identischen Klassen.

EF stimmt mit den Klassennamen UND Klasseneigenschaften überein. Also habe ich gerade einen Eigenschaftsnamen für eines der EF-Objekte geändert und der Fehler ist weg.

Als @Entrodus eine der anderen Antworten kommentierte:

Eine EF-Kollision tritt nur dann auf, wenn zwei Klassen denselben Namen UND die .__ haben. der gleiche Satz von Parametern.

37
Matt

Diese MSDN Forum Frage kann hilfreich sein. Es wird empfohlen, die BLL- und DAL-Klassen in separaten Baugruppen zu platzieren.

10
Jarno

Für EF 6.x habe ich einige Hinweise unter https://github.com/aspnet/EntityFramework/issues/941 gefunden und dies in meiner Lösung behoben, indem dem EDM-Typ eine Anmerkung hinzugefügt wurde.

Ich habe die EDMX-Datei manuell bearbeitet und eine Zeile wie folgt geändert:

<EntityType Name="CartItem">

zu diesem:

<EntityType Name="CartItem" customannotation:ClrType="EntityModel.CartItem">

oder verwenden Sie dies, wenn Sie einen anderen Typ haben:

<EntityType Name="CartItem" customannotation:ClrType="MyApp.CartItem, MyApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">

dabei ist EntityModel der für mein EF-Modell verwendete Namespace und MyApp der Namespace eines Geschäftsobjekts

5
Ekus

In einigen Fällen ist dies eher ein Symptom als das tatsächliche Problem. Für mich erscheint es normalerweise, wenn ich versuche, eine Funktion in einer Linq-Abfrage aufzurufen, ohne .ToList () aufzurufen.

Z.B. Der Fehler, der mich hierher gebracht hat, wurde verursacht, weil ich Folgendes getan habe:

var vehicles = DB.Vehicles.Select(x => new QuickSearchResult()
{
    BodyText = x.Make + " " + x.Model + "<br/>"
    + "VIN: " + x.VIN + "<br/>"
    + "Reg: " + x.RegistrationNumber +"<br/>"
    + x.AdditionalInfo
    type = QuickSearchResultType.Vehicle,//HERE. Can't use an enum in an IQueryable.
    UniqueId = x.VehicleID
});

Ich musste .ToList () aufrufen, dann jedes Element durchlaufen und ihm den Typ zuweisen.

4

Dies war möglicherweise nicht verfügbar, als die Frage gestellt wurde. Eine andere Lösung besteht darin, das EDMX zu löschen und es als ein Datenmodell mit erster Entität zu erstellen. In EF6 können Sie mit code-first zwei Klassen mit demselben Namen aus unterschiedlichen Modell-Namespaces zuordnen, ohne einen Konflikt zu erstellen.

Um das Entitätsdatenmodell in Visual Studio (2013) zu erstellen, wählen Sie "Hinzufügen"> "Neues Element ..."> "ADO.NET-Entitätsdatenmodell". Stellen Sie sicher, dass Sie die Option "Code First from database" auswählen.

1
Tawab Wakil

Ich denke, Sie haben eine Klasse X mit dem Namen "MyClass" in Entity-Modellen und eine andere Klasse mit dem Namen "MyClass" im selben WorkFolder oder Extended der ersten Klasse .. _.

0

Ich konnte dieses Problem lösen, ohne die Klassen, Eigenschaften oder Metadaten umzubenennen.

Ich hatte mein Projekt mit einer T4-Transformation eingerichtet, die Entitätsobjekte in einem DAL-Projekt erstellt, und eine T4-Transformation, die Domänenobjekte in einem Domänenprojekt erstellt, beide auf das EDMX bezogen, um identische Objekte zu generieren, und dann habe ich die DAL-Objekte den Domänenobjekten zugeordnet .

Der Fehler trat nur auf, wenn ich in meinen Abfragen auf andere Klassen (in meinem Fall Enums) aus der Domänenassembly verwies. Als ich sie entfernte, ging der Fehler weg. Es sieht so aus, als würde EF meine Domain Assembly aus diesem Grund laden, die anderen Klassen mit identischem Namen sehen und explodieren.

Um dies zu beheben, habe ich eine separate Assembly erstellt, die nur meine T4-transformierten Domänenklassen enthielt. Da ich diese niemals in einer Abfrage verwenden muss (nur nach der Abfrage, der zugeordnet werden soll), habe ich dieses Problem nicht mehr. Dies scheint sauberer und einfacher als die Antworten unten.

0
Carson

Ich habe den obigen Fehler erhalten, da für beide Verbindungszeichenfolgen derselbe Wert für Metadaten in der Konfigurationsdatei meines Hauptprojekts angegeben wurde, wie unten:

<add name="EntitiesA" connectionString="metadata=res://*/EntitiesA.csdl|res://*/EntitiesA.ssdl|res://*/EntitiesA.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=localhost;initial catalog=MyDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

<add name="EntitiesB" connectionString="metadata=res://*/EntitiesA.csdl|res://*/EntitiesA.ssdl|res://*/EntitiesA.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=localhost;initial catalog=MyDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

Am Ende habe ich die richtige Verbindungszeichenfolge aus der Konfigurationsdatei des EntitiesB-Projekts kopiert.

0

Für mich lag das daran, dass ich versuchte, auf einen Typ mit demselben Namen in der falschen Kontextinstanz zuzugreifen.

Nehmen wir an, sowohl ContextA als auch ContextB haben SomeType. Ich habe versucht, auf ContextA.SomeType in einer Instanz von ContextB zuzugreifen.

0
Dave Cousineau

wenn Sie 2 Verbindungszeichenfolge in der Webkonfiguration haben, Sie jedoch eine Verbindungszeichenfolge verwenden möchten Sie verwenden die dynamische Verbindungszeichenfolge für andere Entitäten . Ich habe edmx (db first) und erste Entitäten in meiner Lösung . Ich verwende diese Klasse in ersten Entitäten von Code.

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Entity.Core.EntityClient;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Data
{
    public class SingleConnection
    {
        private SingleConnection() { }
        private static SingleConnection _ConsString = null;
        private String _String = null;

        public static string ConString
        {
            get
            {
                if (_ConsString == null)
                {
                    _ConsString = new SingleConnection { _String = SingleConnection.Connect() };
                    return _ConsString._String;
                }
                else
                    return _ConsString._String;
            }
        }

        public static string Connect()
        {
            string conString = ConfigurationManager.ConnectionStrings["YourConnectionStringsName"].ConnectionString;

            if (conString.ToLower().StartsWith("metadata="))
            {
                System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder efBuilder = new System.Data.Entity.Core.EntityClient.EntityConnectionStringBuilder(conString);
                conString = efBuilder.ProviderConnectionString;
            }

            SqlConnectionStringBuilder cns = new SqlConnectionStringBuilder(conString);
            string dataSource = cns.DataSource;
            SqlConnectionStringBuilder sqlString = new SqlConnectionStringBuilder()
            {
                DataSource = cns.DataSource, // Server name
                InitialCatalog = cns.InitialCatalog,  //Database
                UserID = cns.UserID,         //Username
                Password = cns.Password,  //Password,
                MultipleActiveResultSets = true,
                ApplicationName = "EntityFramework",

            };
            //Build an Entity Framework connection string
            EntityConnectionStringBuilder entityString = new EntityConnectionStringBuilder()
            {
                Provider = "System.Data.SqlClient",
                Metadata = "res://*",
                ProviderConnectionString = sqlString.ToString()
            };
            return entityString.ConnectionString;
        }
    }
}

Und wenn ich Entitäten anrufe 

private static DBEntities context
{
get
{
    if (_context == null)
        _context = new DBEntities(SingleConnection.ConString);

    return _context;

}
set { _context = value; }
}
0
Cetin Sahin

Fügen Sie einfach das EntityFramework als "Code First from database" und nicht als "EF Designer from database" hinzu. Dies hat mein Problem gelöst, aber es hat eine Schattenseite. Wenn Sie Ihre Datenbank ändern, müssen Sie alle Klassen entfernen und erneut hinzufügen oder einfach die Klassen bearbeiten. Ich verwende die letzte, wenn ich die Eigenschaften der Spalten ändere, beispielsweise "Erlaubt null "oder die Größe einer Zeichenfolge. Wenn Sie jedoch Spalten hinzufügen, empfehle ich, die Klassen zu entfernen und erneut hinzuzufügen.

Ein anderer Grund könnte zu diesem Fehler führen: Wenn Sie benutzerdefinierte Assemblys mit Assembly.LoadFile laden, die bereits mit edmx-Dateien in den Speicher geladen wurden. Dadurch werden doppelte Klassen erstellt, die dem Entity Framework nicht gefallen.

0
Thomas