Nie wiem jak obejść błąd z wartością nullable w aplikacji w modelu mvvm

0

Witam,

Jestem tu nowy więc proszę o cierpliwość. Nie programowałem w technologii MVVM i EF. Niestety po odejściu jednego z kolegów mam mały problem z dodaniem do istniejącej aplikacji 2 pól typu double i zaczeły się schody.

Aplikacja jest napisana jak dla mnie trochę za skomplikowanie, ale muszę sobie poradzić. mam nadzieję, że ktoś powie mi co robię źle.

w pliku baza.mdf (MS SQL Serwer 2012), jest sobie struktura danych - firmy:
poleID int,
Nazwa varchar(200),
adres varchar(200)

muszę do tej struktury dodać 2 wartości:
ilość float,
wartosc float

to nie stanowi problemu.

W pliku bazadanych.edmx zrobiłem aktualizację struktury diagramu (update model from database).

zassało mi definicję tych dwóch pól.

do klasy firmy dodałem definicje
public double Ilosc { get; set; }
public double Wartosc { get; set; }

ale po uruchomieniu programu mam coś takiego:

Additional information: The property 'Ilosc' on 'firmy' could not be set to a 'null' value. You must set this property to a non-null value of type 'System.Double'

i jakoś nie mogę znaleźć co robię źle (znalazłem kilka przykładów takich błędów, ale one sugerowały dwóch przypadków:
użycie double? lub odświeżenie definicji w pliku bazadanych.edmx tych pól ustawiając je na Nullable na "true".

pierwsze rozwiązanie generuje błąd kompilacji drugie nic nie pomogło ponieważ dalej mam ten błąd co wyżej.

Bardzo proszę o pomoc i wyrozumiałość.

pozdrawiam serdecznie,

1

do klasy firmy dodałem definicje
public double Ilosc { get; set; }
public double Wartosc { get; set; }

Jeżeli zrobiłeś update modelu z bazy danych, to EF powinien sam te pola dodać do klasy. Ręczna ingerencja w model (poza konstruktorami) skutkuje masą różnych błędów.

0

Dziękuję za odpowiedź. A czy możesz mi napisać jak to poprawić bądź naprawić ? Wycofałem zmiany i spróbowałem najpierw poprawić zmiany w pliku bazadanych.mdf modyfikując definicję tabeli (dodając te pola). Następnie otworzyłem diagram Entity Data Model (baza.edmx) i zrobiłem update from database (refresh table firmy), i nic nie zaktualizowało w samej definicji klasy Firmy. Jaka powinna być kolejność takiej aktualizacji. Przyznam się szczerze, że nie zajmowałem się wcześniej taką metodą programowania i jestem zmuszony do szybkiego jej się nauczenia...
pozdrawiam serdecznie

0

Dodając kolumny pewnie nie ustawiłeś ich jako NOT NULL. Dlatego mogą przyjmować wartości null.
Więc dlaczego wpisujesz

public double Ilosc { get; set; }
public double Wartosc { get; set; }

zamiast

public double? Ilosc { get; set; }
public double? Wartosc { get; set; }

?

Pewnie gdzieś jakiś konstruktor ładuje w to null i skutkuje to takim a nie innym błędem.

0

hm. Dałem wszędzie "Allow null", ale nie pomyślałem o konstruktorze. Dzięki. Puściło mnie jednak niewiele dalej. Mianowicie,

mam napisaną taką metodę asynchroniczną, która wykonuje się w chwili inicjacji: Set.ToList();

public static async void AddContectAsync(this Control Owner)
       where T : class, new()
{
      Owner.IsEnabled = false;
      Owner.DataContext = await Task.Run(() => 
      {
             T mvm = new T();   
             return mvm;
      });
     Owner.IsEnabled = true;
}

na linii T mvm = new T(); zatrzymuje się wykonanie.

Mogę prosić o jakieś sugestie ?

pozdrawiam serdecznie,

0

Debugować

0

chętnie, ale jak wspomniałem do programowania asynchronicznego jestem za krótki. Debugowanie Task.Run to trochę jak dla mnie za duża trudność....

pozdrawiam serdecznie,

0

A co jest w tym trudnego?

0

dziękuję za pomoc. Bardzo mi taka odpowiedź pomogła. Nie jestem aż tak elokwentny jak Ty, może i dlatego zadaję takie pytania. Dziwne, że moderator, tą odpowiedź nie zmoderował. Ani twoja ani teraz moja nic nie wnosi do rozwiązania... pozdrawiam

0

spróbowałem ten temat debugować. Doszedłem do takiego momementu. W chwili wykonania Set.ToList(), wypyszczył błąd wykonania selekcji danych z tabeli:
select id, nazwa, ilosc, wartosc from firmy {warunek} że tych pól {ilosc, wartosc} - nie ma.
W bazie w tabeli firmy jest deklaracja, w klasie firmy też, ale nie znalazłem tego w plikach w folderze Model/Entity Data Model/*.ssdl *.msl i *.csdl

Czy powinienem coś ręcznie zmodyfikować czy to powinno z automatu przejść do tych plików. A może coś zostało pominięte ? ale nie wiem gdzie
w View/FirmyView.xaml (tych pól nie ma bo jeszcze ich nie dodałem,
w Model/Firmy.cs pola sa zdefiniowane
w ViewModel/FirmyViewModel.cs też są

Nie wiem co jest źle. Pomoże ktoś ?

0

Jak debugować Task.Run:

public static async void AddContectAsync(this Control Owner)
       where T : class, new()
{
      Owner.IsEnabled = false;
      Owner.DataContext = await Task.Run(() => 
      {
             T mvm = new T();    //W TEJ LINII USTAWIAMY BREAKPOINT i wtedy jeśli Task.Run ruszy to się tutaj zatrzyma albo wywalamy calosc do osobnej metody i tam stawiamy breakpointa
             return mvm;
      });
     Owner.IsEnabled = true;
}

Co do tego że coś gdzieś nie masz dopisane. Skoro nie jest dopisane to może warto dopisać/przegenerować? Nie miałem do czynienia z EF więc nie wiem jak to się tam generuje. Dokumentacja prawdę zapewne powie.

0

Jak zdebugować to ja już wiem - rano to opisałem.

Gdzieś wyczytałem że to wymaga "clean & rebuild" gdzie indziej, że .... odpowiedzi można mnożyć.
Nic mi to nie dało.

W chiwili gdzie wykonywana jest instrukcja (selekcji danych z EF), to pyszczy że nie ma pol które ostatnio dodałem
Wcześniej wspomniane pliki csdl, ssdl, czy coś tam jeszcze to fałszywy alarm - usunąłem je nic się na nowo nie wygenerowało ani zaktualizowało.
Jak wspomniałęm w modelu i viewmodel mam te pola stworzone, opisane, itd.
pliku view nie modyfikowałem ponieważ nie na tym miejscu się wywala.
a czepia się dokładnie tych nowo dodanych pól

pozdrawiam serdecznie,

0

Powodów może być dużo. Nawet zwykły błąd dodania kolumn nie do tej tabelki co trzeba lub wołanie tych pól z innej tabeli która ich nie posiada.
Dokumentację czytałeś? Jak poprawnie korzysta się z EF?
Powodów może być wiele, a programista jest właśnie od tego żeby to wyczaić i zrobić tak jak ma być.
Nie jestem w stanie Ci pomóc gdyż z tych informacji nie można już nic więcej wymyśleć.

0

Ok, rozumiem, że Ci co wiedzą nie chcą odpowiedzieć, a UnlimitedPL, próbuje mnie odnieść do dokumentacji i samodzielnego myślenia. Gdybym miał na to czas to nie pytał się tylko sam sobie bym temat rozpracował. Chciałem przyspieszyć znalezienie rozwiązania. Pytam więc po co te forum, skoro i tak mam problem rozwiązać sam ? UnLimitedPL w którejś wcześniejszej odpowiedzi mówi że nie wie o EF, ale próbuje pomóc na siłę w inny sposób -> "Zrób to sam". Ręce opadają.
Dziękuję za dobre chęci i pomoc. Pozdrawiam

0
Januszek6907 napisał(a):

UnLimitedPL w którejś wcześniejszej odpowiedzi mówi że nie wie o EF, ale próbuje pomóc na siłę w inny sposób -> "Zrób to sam". Ręce opadają.

Aha to mam "na siłę" dawać pomoc z czegoś z czego nie miałem nigdy do czynienia. Napisałem już w komentarzu. Chcesz możesz zapłacić chętnie poznam EF i rozwiążę Twój problem.

1

Gdybym miał na to czas to nie pytał się tylko sam sobie bym temat rozpracował

Czas to pieniadz, nie masz go? to zaplac zeby ktos zrobil cos ZA CIEBIE

Pytam więc po co te forum, skoro i tak mam problem rozwiązać sam

Po co to forum skoro musze sam zrobic obiad! Daja mi przepisy ale nadal musze robic sam! a nawet nie wiem do konca czego chce

Podales szczatkowe informacje i jeszcze narzekasz, ze nie masz odpowiedzi :D gratulacje.

Ogolnie sprawa jest prosta

zaplac komus (jak chcesz to moge Ci to zrobic za 50euro/godzina) i daj temu komus dostep przez teamviewer lub do kodu

0

Panowie, Dziękuję za taką pomoc. Pozdrawiam. Jak będę chciał zapłacić to na pewno nie komuś tak bezczelnemu. Do tej pory w moim rozumieniu, to forum było od udzielania podpowiedzi a nie od naśmiewania się. Ale jak 20 lat obserwuje takie forum gdzie pojawiają się tak mili ludzie, to nic dziwnego, że to spada na psy. A tak przy okazji dla Fasadin - PLONK, pamiętasz takie coś ?

0

I tak na zakończenie - Panowie Specjaliści - (biorący udział w konwersacji), żaden nie wpadł na debilny pomysł by spytać - czy jest kopiowany plik danych do której odnosi się definicja Entity Data Model ? Bo wyraźnie czepia się do tego że brakuje pól w tabelli - a kiedy taka sytuacja będzie ?
jak będzie otwierany plik danych - bez właściwej struktury. 50Euro za godzinę ? Za co ? za brak wiedzy.

Do moderatora - rób Pan co chcesz - możesz nawet usunąć konto - to idiotyczne by pisać tu na forum, jak nikt nie jest w stanie znaleźć prostej przyczyny. Podkreśla też poziom wiedzy albo cwaniactwa członków forum. Dla mnie to jest jednak porażka. 4 dni nikt nie był w stanie powiedzieć nic sensownego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1