Abbiamo un Supplier
enum
Ma ora dobbiamo anche avere alcuni dati di dominio su quella relazione
Quindi nel 99,9% nel codice del dominio eseguiamo operazioni sul product.Supplier == Suppliers.FedEx
simile all'enumerazione product.Supplier == Suppliers.FedEx
Ma ora abbiamo anche aggiunto product.SupplierInfo.CanAdjustPickupTime
dove SupplierInfo
è un'entità e non solo un semplice tipo enum.
Ho provato queste configurazioni
Property(p => p.Supplier)
.IsRequired()
.HasColumnName("SupplierId");
HasRequired(p => p.SupplierInfo)
.WithMany()
.HasForeignKey(p => p.Supplier); //I have also tried casting to int doing .HasForeignKey(p => (int)p.Supplier)
Questo fallirà con
Il ResultType dell'espressione specificata non è compatibile con il tipo richiesto. L'espressione ResultType è 'MyApp.Model.Suppliers', ma il tipo richiesto è 'Edm.Int32'. Nome del parametro: keyValues [0]
Anche provato
Property(l => l.Supplier)
.IsRequired()
.HasColumnName("SupplierId");
HasRequired(p => p.SupplierInfo)
.WithMany()
.Map(m => m.MapKey("SupplierId"));
Questo sarà offroad e darà il buon vecchio
Uno o più errori di convalida sono stati rilevati durante la generazione del modello:
SupplierId: Name: ogni nome di proprietà in un tipo deve essere univoco. Il nome della proprietà 'SupplierId' è già definito.
Potrei definire HasForeignKey
SupplierId come uso di proprietà con HasForeignKey
ma poi ho bisogno di passare a .SuppliedId == (int)Suppliers.FedEx
ecc. Non è davvero una soluzione.
Potrei anche aggiungere un enum di proprietà che utilizza la proprietà SupplierId come campo di supporto, ma questo non funzionerà con le espressioni dato che è necessario utilizzare le proprietà del DB mappate reali
Qualche idea?
Il modo migliore che ho trovato per affrontare questo scenario è quello di mappare il Fornitore come un normale oggetto di dominio e creare una classe separata di ID fornitore conosciuti.
public class KnownSupplierIds
{
public const int FedEx = 1;
public const int UPS = 2;
// etc.
}
if (product.Supplier.SupplierId == KnownSupplierIds.Fedex) { ... };
Quando il codice deve controllare il fornitore, può confrontare gli ID; quando hai bisogno di ulteriori informazioni dal modello di dominio, devi solo caricare il fornitore. La ragione per cui preferisco usare una classe di costanti invece di una enumerazione è che il pattern funziona anche per i confronti tra stringhe e non è necessario eseguire il cast.