Quindi ho fatto un buon lavoro separando il DAL dalla BLL. Io uso repository per ogni radice aggregata. Il problema che sto riscontrando è la concorrenza del database con gli ID nel dominio.
Non voglio usare la chiave surrogata nel livello dominio (ad esempio GUID). Quindi la radice aggregata che ho ora è un Journal e quel Journal ha un elenco di transazioni. La prima tabella è Journals e la seconda tabella è Transactions che esegue il mapping alla prima tabella.
Sembra questo:
Riviste
+----------------------------------------+
| ID | JournalID | LastTransactionID |
+----------------------------------------+
|{a-as}| 1 | 8 |
|{ase1}| 2 | 1 |
|......|...........|.....................|
|{1sas}| 45 | 4 |
+----------------------------------------+
Rapporti
+----------------------------------------------------+
| ID | JournalID | TransactionID | Account | Amount|
+----------------------------------------------------+
|{a2ba}| 1 | 1 | xxxxxxx | 10.20 |
|{2a4a}| 1 | 2 | xxxxxxx | 1.10 |
|{20s9}| 2 | 1 | xxxxxxx | 93.12 |
|......|...........|...............|.........|.......|
|{9eka}| 45 | 4 | xxxxxxx | 291.10|
+----------------------------------------------------+
Quindi utilizzo LastTransactionID dalla colonna Journals per capire come assegnare un ID dominio (TransactionID) alle nuove transazioni. Il problema che sto riscontrando è se più istanze di app desktop accedono allo stesso Journal, quindi LastTransactionID potrebbe essere obsoleto e causare problemi con il tentativo di inserire nuove transazioni.
Le mie classi di dominio assomigliano a:
class Journal
{
public int JournalID { get; private set; }
public int LastTransactionID { get; private set; }
public IEnumerable<Transaction> Transactions { get; private set; }
public Journal(int journalID, int lastTransactionID, IEnumerable<Transaction> transactions)
{
// do work......
}
}
class Transaction
{
public int JournalID { get; private set; }
public int TransactionID { get; private set; }
public Account Account { get; private set; }
public Money Amount { get; private set; }
public Journal(int journalID, int transactionID, Account account, Money amount)
{
// do work......
}
}
Sto usando EF e ho incapsulato nel mio repository. Forse sto usando un cattivo design del database?