ObjectContext, łączenie nowych encji z już podłączonymi

ObjectContext, łączenie nowych encji z już podłączonymi
  • Rejestracja: dni
  • Ostatnio: dni
0

Piszę aplikację działającą na bazie danych. Oto wycinek kodu:

Kopiuj
Recipe newRecipe = null;

using (var sut = new MyModelContainer())
{
	newRecipe = new Recipe
	{
		Title = "Tytul",
		Directions = "cos tam cos",
		RequiredTime = TimeSpan.FromSeconds(10),
		UsedIngredients = new EntityCollection<UsedIngredient>()
	};

	newRecipe.UsedIngredients.Add(new UsedIngredient { Ingredient = sut.Ingredients.First(), Amount = "duzo" });
}

using (var sut = new MyModelContainer())
{
	sut.Recipes.AddObject(newRecipe);
	sut.SaveChanges();
}

Niesety wywala mi się na:

Kopiuj
sut.Recipes.AddObject(newRecipe);

System.InvalidOperationException: The EntityKey property can only be set when the current value of the property is null.

W rzeczywistości te obiekty są przesyłane przez WCF-a, ale problem jest podobny.
Tworzymy nowy obiekt Recipe, do którego dorzucamy nowe obiekty typu UsedIngredient, które to chcemy połączyć z obiektami Ingredient wyciągniętymi z bazy danych. Oczywiście wszystko dzieje się po stronie klienta, a w WCF-ie ma to być tylko utrwalone.

TO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0
Kopiuj
using (var sut = new MyModelContainer())
{
        newRecipe = new Recipe
        {
                Title = "Tytul",
                Directions = "cos tam cos",
                RequiredTime = TimeSpan.FromSeconds(10),
                UsedIngredients.Add(new UsedIngredient { Ingredient = sut.Ingredients.First(), Amount = "duzo" });
        }
}

?

  • Rejestracja: dni
  • Ostatnio: dni
0

Niestety, ale to nie rozwiązuje mojego problemu. Celowo w taki sposób to napisałem, bo chodziło o zasymulowanie warunków podobnych przy wykorzystaniu WCF-a.

Problem polega na tym, że kolekcja UsedIngredients jest po stronie klienta reprezentowana przez ObservableCollection.
Po stronie WCF-a chciałbym tylko dodać przesłany obiekt. Jeżeli coś nie istnieje (Np. składnik), to niech zostanie dodane do bazy. Jeżeli istnieje, to niech zostanie wykorzystany aktualny klucz obcy itp.

TO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 10
0

Nie do końca rozumiem Twoje intencje.
Jeśli chodzi o pobranie obiektu który ma właściwość typu innej tabeli, to przy pobraniu trzeba użyć Include("nazwaTypuInnejTabeli").
Gdy chcemy zaktualizować obiekt główny, to trzeba będzie w tych właściwościach które zawiera obiekt główny sprawdzić, czy istnieje Id danego składnika. Jeśli tak to pobieramy je z bazy, jeśli nie to dodajemy nowe.

  • Rejestracja: dni
  • Ostatnio: dni
0

To może z czym ogólnie mam problem. To powyżej to miał być tylko przykład.

Mam taką prostą bazę danych:
http://i46.tinypic.com/jayoie.png

Dane z niej udostępniam za pomocą WCF-a.
Typowy scenariusz to dodanie kilku składników do bazy. Czyli leci od klienta WCF-a utworzony obiekt Ingredient do WCF-,a potem do bazy za pomocą ObjectContext.

Do klienta wraca obiekt z uzupełnionym ID itp...

Teraz tworzę nowy obiekt typu Recipe i dorzucam do niego obiekty UsedIngredient powiązane z wybranymi obiektami Ingredient.
Taki obiekt leci do WCF-a. Jest jeszcze wersja, gdzie obiekt Recipe jest aktualizowany. Np. dodane są nowe składniki itp.

Jak ogólnie coś takiego się robi?

Przy kolejnych wowołaniach WCF-a, obiekty Ingredient, które do niego przychodzą, choć mają swoja reprezentację w bazie danych, to ogólnie nie są attachowane, bo to są już inne obiekty (są klonami). Problem w tym, że jeżeli doszły nowe obiekty, to ja nie wiem, które są nowe, a które sklonowane. Czy istnieje jakiś prosty sposób na taką aktualizację/dodanei obiektu Recipe, żeby ObjectContext sam sprawdził, czy powiązane obiekty istnieją czy nie?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.