Moim zdaniem pole ID obiektu biznesowego powinno być tylko do odczytu (publiczne pobranie i prywatny zestaw), ponieważ z definicji identyfikator nigdy się nie zmieni (ponieważ jednoznacznie identyfikuje rekord w bazie danych).Czy identyfikator obiektu biznesowego powinien być tylko do odczytu, czy nie?
Powoduje to problem podczas tworzenia nowego obiektu (identyfikator jeszcze nie ustawiony), zapisz go w bazie danych za pomocą procedury przechowywanej na przykład, która zwraca nowo utworzony identyfikator, a następnie w jaki sposób zapisać go z powrotem w obiekcie, jeśli Właściwość ID jest tylko do odczytu?
Przykład:
Employee employee = new Employee();
employee.FirstName="John";
employee.LastName="Smith";
EmployeeDAL.Save(employee);
Jak działa metoda Save (które w rzeczywistości łączy się z bazą danych, aby zapisać nowego pracownika) zaktualizować właściwość IDpracownika w obiekcie pracownika, jeśli ta właściwość jest tylko do odczytu (który powinien być ponieważ EmployeeId nigdy się nie zmieni, gdy zostanie utworzony).
Wygląda na to, że Id powinien być zapisywalny przez DAL i tylko do odczytu dla reszty świata. Jak to zaimplementować, szczególnie jeśli klasy DAL i obiekty biznesowe są w różnych złożeniach?
Nie chcę tworzyć metody Save w klasie Employee, ponieważ ta klasa nie powinna mieć nic wspólnego z bazą danych.
Stary problem, dla którego nie wierzę, jest "miła" odpowiedź, a przynajmniej zły kompromis. –
Anthony, usunąłem moją odpowiedź. Myślę, że już się komplikowałem. Zgadzam się z @Martin Brown. Nie ma prostej odpowiedzi na problem. Poszedłbym z tworzeniem nowego obiektu, nawet jeśli oznacza to skopiowanie wszystkich właściwości. –
@Bruno. Już miałem skomentować, że twoja odpowiedź prawdopodobnie zadziała. Wygląda na to, że najlepiej jest zrobić to wewnętrznie: public int Id {get; zestaw wewnętrzny; } W ten sposób tylko DAL będzie mógł go zaktualizować i zezwolić DAL na aktualizację "wewnętrznej" właściwości ID: [assembly: InternalsVisibleTo ("DAL_Assembly")] W ten sposób dla DAL wewnętrzna właściwość ID będzie aktualizowalna . – Anthony