I 5. Datenbank zuerst mit Entity Framework bin Wir haben zwei Tabellen (massiv vereinfacht):Wie Ändern Navigation Eigenschaftsnamen in bedeutungsvollen Namen
- Adressen
- Straße
- Town (etc .)
- Kunden
- Namen
- Rechnungsanschrift
- deliveryaddress
- AltDeliveryAddress
Wenn wir Visual Studio verwenden, um die Datenbank in EF ("Update Modell aus der Datenbank") zu importieren, wir mit dem Code am Ende wie folgt:
Customer myCustomer;
var a = myCustomer.Address;
var b = myCustomer.Address1;
var c = myCustomer.Address2;
Was ich natürlich will, ist so etwas wie dieses:
var a = myCustomer.BillingAddress;
var z = myCustomer.BillingAddress.Street; // etc.
Ich könnte einfach das Modell im Designer bearbeiten und die Navigationseigenschaft ändern, um mir den richtigen Namen zu geben. Dies ist jedoch keine praktikable Lösung, da wir das Modell jedes Mal neu erstellen, wenn wir Änderungen an der Datenbank vornehmen.
Eine Option, die ich versucht habe, ist eine partielle Klasse wie folgt zu schaffen (Code aus bestehenden MyModel.Designer.cs kopiert nur mit dem Eigenschaftsnamen geändert):
public partial class Customer : EntityObject
{
[EdmRelationshipNavigationPropertyAttribute("MyModel", "FK_Customers_Addresses_BillingAddress", "Address")]
public Address BillingAddress
{
get {
return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<LookupItem>("MyModel.FK_Customers_Addresses_BillingAddress", "Address").Value;
}
set {
((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<LookupItem>("MyModel.FK_Customers_Addresses_BillingAddress", "Address").Value = value;
}
}
}
Jedoch, wenn ich diese laufen, bekomme ich der folgende Fehler:
The number of members in the conceptual type 'MyModel.Customer' does not match with the number of members on the object side type 'MyNamespace.DataModel.Customer'. Make sure the number of members are the same.
Ich habe versucht, mit dem Attribut [NotMapped()], aber das hat keinen Unterschied gemacht. Wenn ich das entfernen [EdmRelationshipNavigationPropertyAttribute ...] Attribut dann die Linq mit dem folgenden Fehler klagt:
The specified type member 'BillingAddress' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.
Gibt es eine andere Art und Weise aussagekräftige Namen zu erreichen, in der Kunden-Objekt?
Hier ist, was ich am Ende wollen:
var j = myCustomer.BillingAddress;
var k = myCustomer.BillingAddress.Street;
var l = myCustomer.BillingAddress.Town; // etc.
Das funktioniert, wenn Sie sicher sein können, die Zuordnung zwischen EF generierten Namen und den tatsächlichen Datenbanknamen zu gewährleisten. , d. H. Wenn .Address2 immer AltDeliveryAddress ist, dann ist das in Ordnung, aber es scheint nicht sehr sicher. – andrewpm
Eigentlich nein, das funktioniert nicht, wenn ich versuche, es in LINQ zu verwenden. Hier ist mein Code: var customersInSeattle = cs.Where (c => c.DeliveryAddress.Town == "Seattle"); Ich erhalte diesen Fehler: Der angegebene Typ member 'DeliveryAddress' wird in LINQ to Entities nicht unterstützt. Es werden nur Initialisierungs-, Entitäts- und Entitätsnavigationseigenschaften unterstützt. – andrewpm
Ja, es ist wahr ... Ich fürchte, das ist eine Einschränkung der Datenbank zuerst Ansatz. Es ist eine der Ursachen für uns, EF Code First zu verwenden. In Code First haben Sie die volle Kontrolle über die Entity Mapping. (Code First bedeutet das Mappen im Code, es bedeutet nicht, dass Ihre db aus diesem Code generiert wird, wenn Sie es nicht wollen). –