Wir haben ein EF4 EDMX, das ca. 300 Entitäten enthält, die in unserer Kernproduktsuite verwendet werden (aus der Datenbank importierte Entitäten).
Wenn wir neue Kunden bekommen, wollen sie meistens zusätzliche Informationen speichern und uns mit der Entwicklung von benutzerdefinierten Prozessen beauftragen, die außerhalb unseres Geschäftsbereichs liegen und völlig individuell sind. Wir haben z. B. einen Vertrag mit einem Sicherheitsunternehmen abgeschlossen und sie wollten Informationen über ihre Sicherheitsstufen speichern und Prozesse haben, die auf diese Stufen reagieren.
In jedem Fall müssen wir benutzerdefinierte Tabellen hinzufügen UND/ODER benutzerdefinierte Felder zu bestehenden Entitäten hinzufügen. Wir hatten eine gute Möglichkeit, dies mit der vorherigen Technologie zu tun, bei der die Kernklassenbibliotheken nicht mit benutzerdefinierten Tabellen usw. überladen waren. Wir haben einfach von der Kernentität (gleichbedeutend mit EntityObject in EF) in eine benutzerdefinierte Klassenbibliothek geerbt und nach Bedarf Anpassungen hinzugefügt.
Ebenso wollen wir diese benutzerdefinierten Tabellen und Attribute nicht zu unserem Kern-EDMX hinzufügen. Wir wollen im Wesentlichen "Vererbung" von der Kern-EDMX in einem neuen benutzerdefinierten EDMX in einer separaten Klassenbibliothek, wo wir die Anpassungen hinzufügen können. Durch die Vererbung können wir alles tun, was wir in Core EDMX tun können, und noch ein bisschen mehr.
Wir verwenden eine t4-Vorlage, um unsere Repositories auf der Grundlage dieses Blogbeitrags zu erstellen (wir verwenden keinen Model-First-Ansatz):
Können wir ein EDMX so erweitern, wie wir es benötigen?
Wir kamen mit einer hackish Lösung, eine Methodenerweiterung auf Kern Entitäten, die eine benutzerdefinierte Entität in separaten EDMX wie in unten zurückgibt:
public static class CoreEntityExtensions
{
public static EntityConnection EntityConnection;
public static CustomUserEntity CustomUserDetails(this User coreUser)
{
ICustomUserEntityRepository customUserRepository = new CustomUserEntityRepository(EntityConnection);
return customUserRepository.All().SingleOrDefault(u => u.id == coreUser.id);
}
}
Dies ist jedoch aus einigen offensichtlichen Gründen nicht ideal.
Für jede Hilfe sind wir sehr dankbar.