Question

Nous avons un tableau qui ressemble à peu près à ceci:

CREATE TABLE Lockers 
{
  UserID int NOT NULL PRIMARY KEY (foreign key),
  LockerStyleID int (foreign key),
  NameplateID int (foreign key)
}

Toutes les clés se rapportent à d'autres tables, mais en raison de la manière dont l'application est distribuée, il est plus facile pour nous de transmettre les ID en tant que paramètres. Nous aimerions donc faire ceci:

Locker l = new Locker { 
  UserID = userID, 
  LockerStyleID = lockerStyleID, 
  NameplateID = nameplateID 
};
entities.AddLocker(l);

Nous pourrions le faire avec LINQ-to-SQL, mais pas avec EF?

Était-ce utile?

La solution

Cette fonctionnalité manquante semble gêner beaucoup de gens.

  • Bonne nouvelle: MS va régler le problème avec .NET 4.0.
  • Mauvaise nouvelle: pour l'instant, ou si vous êtes bloqué sur la version 3.5, vous devez effectuer un peu de travail, mais c'est possible.

Vous devez le faire comme ceci:

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();

Autres conseils

Pour simplifier les choses, j'ai ajouté la propriété de clé étrangère moi-même dans la classe partielle:

public int UserID
{
   get
   {
      if (this.User != null)
         return this.User.UserID;
   }
   set 
   {
      this.UserReference.EntityKey = new System.Data.EntityKey("entities.User", "ID", value);
   }
}

Vous pouvez créer une méthode d'extension qui construit l'entité en fonction de ces identifiants.

L'utilisation d'un EntityKey résout votre problème;)

alk.

une autre méthode si vous ne voulez pas polluer votre schéma de base de données consiste à ajouter une colonne calculée, par ex. Si vous avez un champ de clé étrangère FK_Customer, vous pouvez définir une nouvelle colonne calculée FK_Customer_Computed qui contient l'expression FK_Customer. Lorsque vous générez \ update votre modèle edmx, le champ apparaît comme un champ normal que vous pouvez ensuite référencer à partir de votre objet entité.

Ou attendez EF4:)

Suite à la réponse de Dylan, Alex James a écrit un blog sur ce sujet, expliquant en détail le problème et expliquant comment procéder pour la solution partielle classe + propriété.

Simulation de clés étrangères - EF3.5

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top