2016-06-06 5 views
0

Ich benutze EntityFramework 7 in UWP-Anwendung (EntityFrameworkCore.SQLite). Microsoft empfiehlt die Verwendung eines neuen Kontexts, wenn in der Datenbank Anforderungen zur Leistungserhöhung ausgeführt werden sollen. Allerdings habe ich ein Problem, wenn ich ein neues Element mit einer bestehenden Beziehung in verschiedenen Kontexten hinzufügen möchte. Zum Beispiel habe ich eine Klasse Person und Klasse Hund. Eine Person hat viele Hunde und ein Hund hat nur einen Besitzer. In meinem Fall möchte ich einen neuen Hund hinzufügen, der eine vorhandene Person als Besitzer hat.EF7 Entität mit Beziehung in verschiedenen Kontext hinzufügen

Ich möchte auch eine Abstraktionsschicht erstellen, um den Datenzugriff von meinen ViewModels zu trennen.

Hier sind meine Klassen:

public class Person 
{ 
    public int PersonId { get; set; } 
    public string Name { get; set; } 

    public List<Dog> Dogs { get; set; } 
}  

public class Dog 
{ 
    public int DogId { get; set; } 
    public string Name { get; set; } 

    public int PersonId { get; set; } 
    public Person Person { get; set; } 

    public Dog(string name, Person person) 
    { 
     Name = name; 
     Person = person; 
    } 
} 

Und kann mein Anwendungsfall durch den folgenden Code dargestellt werden:

Person person = new Person() { Name = "Samuel" }; 
using (var db = new DatabaseContext()) 
{ 
    db.People.Add(person); 
    db.SaveChanges(); 
} 

using (var db = new DatabaseContext()) 
{ 
    Dog dog = new Dog("Droopy", person); 
    db.Dogs.Add(dog); 
    db.SaveChanges(); 
} 

Wenn ich diesen Code ausführen, wird EF eine neue Instanz der Person erstellen in die Datenbank. Eine Abhilfe ist, den Hund Konstruktor durch den folgenden Code zu ersetzen:

public Dog(string name, Person person) 
{ 
    Name = name; 
    PersonId = person.PersonId; 
} 

Aber was ist die beste (und andere) Lösung mein Problem zu lösen?

Samuel

Antwort

0

Sie können alles, was Sie in einer einzigen Datenbank-Aufruf wollen tun:

using (var db = new DatabaseContext()) 
{ 
    var person = db.Persons.Single(p => p.PersonId == personId); // Tracks your person 
    person.Dogs.Add(new Dog("Droopy")); 
    db.SaveChanges(); 
} 
+0

Danke Steve. Es ist eine Möglichkeit. Aber das erfordert etwas mehr Code in meiner Abstraktionsschicht. Aber ich sehe keine andere Lösung –

+0

Auch ich weiß nicht, ob es für die Leistung besser ist, als einen Kontext für alle zu haben –

+0

Ja, viel besser. Ein Datenbankanruf versus zwei plus Sie werden nur einmal neu eingerichtet und entsorgen. Jeder Aufruf von SaveChanges() ruft die Datenbank auf, um diese zu minimieren. –

Verwandte Themen