Kann mir bitte jemand helfen, diesen Fehler zu beheben?
Das angegebene Schema ist ungültig. Fehler:
Die Zuordnung des CLR-Typs zum EDM-Typ ist nicht eindeutig, 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 dies enthält die gleichen Klassen der DAL, unterscheidet sich jedoch im Namespace und dies ist die Ursache des Problems
Ich kann nicht wissen, wie ich dieses Problem beseitigen kann. Können Sie mir bitte helfen?
Ich würde mich auch freuen, wenn mir jemand ein Beispiel für die Verwendung der n-Tier-Architektur mit EF geben würde
Vielen Dank
quelle
Problemumgehung: Ändern Sie eine Eigenschaft für eine der beiden identischen Klassen.
EF stimmt mit Klassennamen UND Klasseneigenschaften überein. Also habe ich gerade einen Eigenschaftsnamen für eines der EF-Objekte geändert, und der Fehler ist verschwunden.
Als @Entrodus eine der anderen Antworten kommentierte:
quelle
Diese Frage zum MSDN-Forum könnte hilfreich sein. Es wird empfohlen, die BLL- und DAL-Klassen in separaten Assemblys zu platzieren.
quelle
tblSetting
. Ich habe es auf 2 verschiedene Baugruppen gelegt (immer auf verschiedene Baugruppen) und es funktioniert nicht :(Für EF 6.x habe ich unter https://github.com/aspnet/EntityFramework/issues/941 einige Hinweise gefunden und dies in meiner Lösung durch Hinzufügen von Anmerkungen zum EDM-Typ behoben.
Ich habe die EDMX-Datei manuell bearbeitet und eine Zeile wie folgt geändert:
<EntityType Name="CartItem">
dazu:
<EntityType Name="CartItem" customannotation:ClrType="EntityModel.CartItem">
oder verwenden Sie diese Option, wenn Sie einen anderen Typ an anderer Stelle 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
quelle
customannotation:UseClrTypes
soll<EntityContainer>
. (Arbeitete immer noch nicht für mich in EF 6)In einigen Fällen ist dies eher ein Symptom als das eigentliche Problem. Für mich wird es normalerweise angezeigt, wenn ich versuche, eine Funktion in einer Linq-Abfrage aufzurufen, ohne zuvor .ToList () aufzurufen.
ZB wurde der Fehler, der mich hierher gebracht hat, verursacht, weil ich dies 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.
quelle
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 Code-First-Entity-Datenmodell neu zu erstellen. In EF6 können Sie mit Code-First zwei Klassen mit demselben Namen aus verschiedenen Modell-Namespaces zuordnen, ohne einen Konflikt zu erzeugen.
Um das Entitätsdatenmodell in Visual Studio (2013) zu erstellen, gehen Sie zu "Hinzufügen"> "Neues Element ..."> "ADO.NET-Entitätsdatenmodell". Stellen Sie sicher, dass Sie die Option "Code First from Database" auswählen.
quelle
Ich habe den obigen Fehler erhalten, weil ich für beide Verbindungszeichenfolgen den gleichen Wert für Metadaten hatte, der in der Konfigurationsdatei meines Hauptprojekts angegeben ist, wie unten:
<add name="EntitiesA" connectionString="metadata=res://*/EntitiesA.csdl|res://*/EntitiesA.ssdl|res://*/EntitiesA.msl;provider=System.Data.SqlClient;provider connection string="data source=localhost;initial catalog=MyDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 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="data source=localhost;initial catalog=MyDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
Am Ende habe ich die richtige Verbindungszeichenfolge aus der Konfigurationsdatei des EntitiesB-Projekts kopiert.
quelle
Ein weiterer Grund für diesen Fehler: Wenn Sie benutzerdefinierte Assemblys mit Assembly.LoadFile laden, die über Edmx-Dateien verfügen, die bereits in den Speicher geladen wurden. Dadurch werden doppelte Klassen erstellt, die dem Entity Framework nicht gefallen.
quelle
Für mich lag dies daran, dass ich versucht habe, auf einen Typ mit demselben Namen in der falschen Kontextinstanz zuzugreifen.
Sag beides
ContextA
undContextB
habeSomeType
. Ich habe versucht,ContextA.SomeType
auf eine Instanz von zuzugreifenContextB
.quelle
Fügen Sie das EntityFramework einfach als "Code First from Database" und nicht als "EF Designer from Database" hinzu. Dies hat mein Problem gelöst, hat aber eine Schattenseite. Wenn Sie Ihre Datenbank ändern, müssen Sie alle Klassen entfernen und erneut hinzufügen oder nur die Klassen bearbeiten. Ich verwende die letzte, wenn ich die Eigenschaften der Spalten ändere, z. B. "Zulassen" null "oder die Größe einer Zeichenfolge. Wenn Sie jedoch Spalten hinzufügen, empfehle ich, die Klassen zu entfernen und erneut hinzuzufügen.
quelle
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 einer T4-Transformation, die Domänenobjekte in einem Domänenprojekt erstellt. Beide verweisen auf EDMX, um identische Objekte zu generieren, und ordneten dann die DAL-Objekte den Domänenobjekten zu .
Der Fehler trat nur auf, wenn ich in meinen Abfragen auf andere Klassen (in meinem Fall Aufzählungen) aus der Domänenassembly verwies. Als ich sie entfernte, verschwand der Fehler. Es sieht so aus, als hätte EF aus diesem Grund meine Domain-Assembly geladen, die anderen gleichnamigen Klassen gesehen und in die Luft gesprengt.
Um dies zu beheben, habe ich eine separate Assembly erstellt, die nur meine T4-transformierten Domänenklassen enthielt. Da ich diese nie in einer Abfrage verwenden muss (erst nach der Abfrage, der sie zugeordnet werden soll), tritt dieses Problem nicht mehr auf. Dies scheint sauberer und einfacher als die folgenden Antworten.
quelle
Wenn Sie 2 Verbindungszeichenfolgen in der Webkonfiguration haben, aber eine Verbindungszeichenfolge verwenden möchten, verwenden Sie die dynamische Verbindungszeichenfolge zum Erstellen anderer Entitäten. Ich habe edmx (db first) und code first Entities in meiner Lösung. Ich verwende diese Klasse in Code First Entities.
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; } }
quelle
Ich denke, Sie haben eine Klasse X mit dem Namen "MyClass" in Entitätsmodellen und eine andere Klasse mit dem Namen "MyClass" in demselben WorkFolder oder Extended der ersten Klasse. Das ist mein Problem und ich behebe es.
quelle
Es gibt eine Bibliothek namens AutoMapper, die Sie herunterladen können. Es hilft Ihnen, Klassenzuordnungen von einem Typ zum anderen zu definieren.
quelle