Witam,
Tworząc aplikację bazodanową warto wykonać logi.
Chciałem zrobić jedną uniwersalną tabelę z logami.
Wyglądałaby mniej-więcej tak:
tbLogs
- id
- idUztkownik // kto dokonal zmiany
- RodzajLogu // czego log dotyczy - grupy, funkcji, usera itd.
- Data // kiedy nastapila modyfikacja danego elementu
- idDaneStare // dane historyczne
- idDaneNowe // dane nowe
- powod // Powód modyfikacji - nieobowiązkowy
Tabela taka w polach idDaneStare i IDDaneNowe przechowuje ID-ki do innych tabel (tbUser, tbFunction, tbGroup itd.).
To do czego id tego obiektu należy uwarunkowane jest w polu "RodzajLogu", gdzie symbol "U" dotyczy usera, "G" grupy itd.
Teoretycznie działałoby to na poziomie bazy dobrze. Jednak pisząc aplikację chciałbym od razu załadować cały obiekt do pamięci.
Tzn:
tbLogs.Load(id: 5);
I wszystkie pola uzupełnione - w tym także pola dotyczące danych historycznych i nowych. W aplikacji odtworzyłęm strukturę, jednak zrobiłem to w ten sposób:
public class Log : IdentifyData
{
private User user = new User();
private DictionaryConcept typeLogs = new DictionaryConcept();
private DateTime date = DateTime.Now;
private IdentifyData oldData = new IdentifyData();
private IdentifyData newData = new IdentifyData();
private string reason = string.Empty;
Ładując dane:
public IdentifyData Load(int id)
{
DataTable table = this.db.Select(id);
if (table.Rows.Count > 1)
throw new Exception("Pobrano zbyt wiele danych.");
if (table.Rows.Count == 0)
return null;
return this.ConvertTo(table.Rows[0]);
}
protected override QuestionnaireLib.IdentifyData ConvertTo(System.Data.DataRow row)
{
Log con = new Log();
con.ID = Convert.ToInt32(row["ID"]);
con.Date = Convert.ToDateTime(row["Date"]);
con.NewData // Tutaj nie wiem z jakiej klasy korzystać
con.OldData // Tutaj nie wiem z jakiej klasy korzystać
con.Reason = row["Reason"].ToString();
DictionaryConcept dic = new DictionaryConcept();
dic.Load(Convert.ToInt32(row["TypeLogs"]));
con.TypeLogs = dic;
User user = new User();
user.Load(Convert.ToInt32(row["IDUser"]));
con.User = user;
return con;
}
Nie wiem jak załadować dane nowe i historyczne. Musiałbym wykonać switcha i sprawdzać typ logu, co nie bardzo mi odpowiada ze względów estetycznych.
Jak widzicie typ logu jest także konkretnym obiektem, a nie zwykłym id, ale na poziomie logiki już wiemy jaka to klasa. Z danymi historycznymi i nowymi tak nie jest, gdyż mogą to być jakiekolwiek inne klasy.
Czy jest na to jakiś lepszy sposób?
Pozdrawiam.