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?

È stato utile?

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à.

Finging Foreign Keys - EF3.5

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top