Problemi di concorrenza DB con ID modello di dominio

2

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?

    
posta keelerjr12 18.04.2018 - 01:44
fonte

1 risposta

1

I don't want to use the surrogate key in the domain layer

Non ho idea del perché non vorresti usare questo. Il tuo BLL sta semplicemente reinventando la ruota cercando di gestire e creare il proprio ID univoco. Lascia che il database faccia i compiti che sa fare meglio.

Avendo un database in grado di creare e applicare un valore unico e renderlo disponibile agli altri utenti del sistema, è così che si gestisce la concorrenza.

Altrimenti, è necessario memorizzare l'ID creato nella BLL da qualche altra parte / istanza dell'applicazione per accedervi. Anche se lo stai tenendo in memoria anziché su un disco, è solo un'altra parte della tua archiviazione dei dati.

L'unico vantaggio di ciò che stai facendo è passare a un database che non ha la possibilità di creare i propri ID univoci.

    
risposta data 18.04.2018 - 16:20
fonte

Leggi altre domande sui tag