Entity Framework: impostazione di una proprietà di chiave esterna
-
20-08-2019 - |
Domanda
Abbiamo una tabella che assomiglia approssimativamente a questa:
CREATE TABLE Lockers
{
UserID int NOT NULL PRIMARY KEY (foreign key),
LockerStyleID int (foreign key),
NameplateID int (foreign key)
}
Tutte le chiavi si riferiscono ad altre tabelle, ma a causa del modo in cui l'applicazione è distribuita, è più facile per noi passare gli ID come parametri. Quindi vorremmo fare questo:
Locker l = new Locker {
UserID = userID,
LockerStyleID = lockerStyleID,
NameplateID = nameplateID
};
entities.AddLocker(l);
Potremmo farlo in LINQ-to-SQL, ma non in EF?
Soluzione
Questa caratteristica mancante sembra infastidire molte persone.
- Buone notizie: MS affronterà il problema con .NET 4.0.
- Cattive notizie: per ora, o se sei bloccato su 3.5 devi fare un po 'di lavoro, ma è possibile.
Devi farlo in questo modo:
Locker locker = new Locker();
locker.UserReference.EntityKey = new System.Data.EntityKey("entities.User", "ID", userID);
locker.LockerStyleReference.EntityKey = new EntityKey("entities.LockerStyle", "ID", lockerStyleID);
locker.NameplateReference.EntityKey = new EntityKey("entities.Nameplate", "ID", nameplateID);
entities.AddLocker(locker);
entities.SaveChanges();
Altri suggerimenti
Quello che ho fatto per semplificare le cose è l'aggiunta della proprietà della chiave esterna nella classe parziale:
public int UserID
{
get
{
if (this.User != null)
return this.User.UserID;
}
set
{
this.UserReference.EntityKey = new System.Data.EntityKey("entities.User", "ID", value);
}
}
È possibile creare un metodo di estensione che costruisce l'entità in base a questi ID.
L'uso di un EntityKey risolve il problema;)
alk.
un altro metodo se non ti dispiace "inquinare" il tuo schema db è quello di aggiungere una colonna calcolata, ad es. se si dispone di un campo chiave esterna FK_Customer, è possibile definire una nuova colonna calcolata FK_Customer_Computed che ha l'espressione FK_Customer. Quando generi \ aggiorni il tuo modello edmx, il campo apparirà come un campo normale a cui puoi fare riferimento dal tuo oggetto entità.
O aspetta EF4 :)
In seguito alla risposta di Dylan, Alex James ha scritto un blog proprio su questo, spiegando il problema in dettaglio e come procedere con la soluzione di classe parziale + proprietà.