2010-04-13 2 views
3

J'ai un processus d'importation avec des régions, des emplacements et des décalages, où un objet Shift a une propriété Location et un objet Location a une propriété Region. Si un nom de région n'existe pas, je crée la région, et comme sage un emplacement. Je pensais pouvoir parfaitement encapsuler la logique 'Select if exists, ou create' dans les classes auxiliaires pour Region and Location, mais si j'utilise des contextes de données locaux dans ces classes, je cours et j'attache des overheads qui deviennent désagréables. Si j'inclue une dépendance de contexte de données dans ces classes, mon encapsulation semble cassée.Comment réaliser une tâche 'select ou insert' en utilisant LINQ to EF?

Quelle est la méthode idéale pour y parvenir, ou quel est l'endroit idéal pour placer cette fonctionnalité? Dans mon exemple, je me suis beaucoup appuyé sur la béquille de clé étrangère fournie avec .NET 4.0, et j'ai simplement évité d'utiliser des entités en faveur des valeurs directes des clés étrangères, mais cela commence à sentir.

Exemple:

public partial class ActivationLocation 
{ 
    public static int GetOrCreate(int regionId, string name) 
    { 
     using (var ents = new PvmmsEntities()) 
     { 
      var loc = ents.ActivationLocations.FirstOrDefault(x => x.RegionId == regionId && x.Name == name); 
      if (loc == null) 
      { 
       loc = new ActivationLocation {RegionId = regionId, Name = name}; 
       ents.AddToActivationLocations(loc); 
       ents.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 
      } 
      return loc.LocationId; 
     } 
    } 
} 

Répondre

2

Dans EF 4, vous pouvez le faire:

var location = context.Locations.Where(l => l.RegionId == regionId) 
           .DefaultIfEmpty(new Location 
                { 
                 RegionId = regionId, 
                 Name  = name 
                }).First(); 
someOtherObject.Location = location; 
context.SaveChanges(); 

... qui fonctionne dans les deux cas.

+0

Merci @Craig, cela semble très utile. Dommage je dois attendre d'utiliser EF 4 jusqu'après mon premier prototype, mais je peux dormir avec mon knopwing code actuel moche une solution élégante est au coin de la rue. – ProfK

Questions connexes