871 messaggi dal 11 febbraio 2013
Debbo creare un campo chiave come in oggetto
Quale il modo piu sicuro di farlo on c#?
871 messaggi dal 11 febbraio 2013
Ho usato un random per generare il campo chiave.
Per essere certo che il valore generato non esista interrogo anche il database.
È sbagliato?
11.726 messaggi dal 09 febbraio 2002
Contributi

Ho usato un random per generare il campo chiave.

Dovresti usare RNGCryptoServiceProvider anziché Random. Qui c'è una disquisizione in merito.
https://stackoverflow.com/questions/418817/pros-and-cons-of-rngcryptoserviceprovider


Per essere certo che il valore generato non esista interrogo anche il database.

Sì, effettivamente potrebbe esserci una certa probabilità di collisioni, quindi meglio verificare. Puoi farlo anche in maniera ottimistica: non fai la verifica ma catturi l'eventuale errore d'inserimento. Generi in nuovo numero e riprovi ad inserire. Continui così finché l'inserimento non ha successo.

Guid 16 digit

Sono 16 digit esadecimali? Quindi 8 bytes rappresentati come stringa esadecimale. Perché questo requisito?

ciao,
Moreno

Enjoy learning and just keep making
871 messaggi dal 11 febbraio 2013
Debbo inserire un id con 16 numeri perché il programma che legge gli xml e genera i documenti nel gestionale lavora così...non so perché

Cmq non ho capito cosa intendi con l'errore...cioe inserisco un try/catch?

Pui fare un esempio?

Ti ho visto su udemy...Grande!!!

Allora quando te lo chiesi ci stavi pensando:)
11.726 messaggi dal 09 febbraio 2002
Contributi
Ciao,

Debbo inserire un id con 16 numeri

Ok ma si tratta di cifre decimali, esadecimali o base64?


cioe inserisco un try/catch?
Pui fare un esempio?

Sì, ma che tecnologia usi per aggiornare i dati? ADO.NET, Entity Framework o Entity Framework Core?


Ti ho visto su udemy...Grande!!!
Allora quando te lo chiesi ci stavi pensando:)

Grazie :) Sì, poi si è presentata l'opportunità quindi ho deciso di farlo. E' tanto impegnativo però :D

ciao,
Moreno

Enjoy learning and just keep making
871 messaggi dal 11 febbraio 2013
Decimali in EF core2.1
11.726 messaggi dal 09 febbraio 2002
Contributi
Ok, allora supponendo di avere una classe di entità come questa:
public class Prodotto
{
  public long Id { get; set; }
}


Mappata in questo modo (nota il ValueGeneratedNever, dato che siamo noi a generare l'id);
modelBuilder.Entity<Prodotto>(builder => 
{
    builder.HasKey(prodotto => prodotto.Id);
    builder.Property(prodotto => prodotto.Id).ValueGeneratedNever();
});


Puoi aggiungere una nuova entità al dbcontext così:
using (var db = new MioDbContext())
{
    var prodotto = new Prodotto();
    db.Add(prodotto);

    using (var crypto = new RNGCryptoServiceProvider())
    {
        int affectedRows = 0;
        int retries = 5;
        do
        {
            //Imposto un id generato casualmente
            prodotto.Id = crypto.GeneraNumeroCompresoTra(1000000000, 10000000000);
            try
            {
                affectedRows = db.SaveChanges();
            }
            //Se l'inserimento fallisce, riprovo finché retries non arriva a 0
            catch (DbUpdateException) when (--retries >= 0)
            {
            }
        } while (affectedRows == 0);
    }
}


Dove GeneraNumeroCompresoTra è un extension method fatto così:
public static long GeneraNumeroCompresoTra(this RNGCryptoServiceProvider crypto, long min, long max)
{
    //Info su questo codice: http://csharphelper.com/blog/2014/08/use-a-cryptographic-random-number-generator-in-c/
    ulong scale = ulong.MaxValue;
    while (scale == ulong.MaxValue)
    {
        byte[] bytes = new byte[ 8 ];
        crypto.GetBytes(bytes);
        scale = BitConverter.ToUInt64(bytes, 0);
    }
    return (long)(min + (max - min) * (scale / (double)ulong.MaxValue));
}


ciao,
Moreno
Modificato da BrightSoul il 04 maggio 2019 15:22 -

Enjoy learning and just keep making
871 messaggi dal 11 febbraio 2013
Ciao

ho seguito le tue istruzioni (quel try catch con when è una chicca pazzesca)

questo è il post

public async Task<IActionResult> Create([FromBody] CreateOrderModel model)
        {
            if (!ModelState.IsValid) return BadRequest(ModelState);

            var user = await _ctx.Users
            .SingleOrDefaultAsync(u => u.UserName == HttpContext.User.Identity.Name);

            var lastId = _ctx.Riorcl.Select(x => x.Id).DefaultIfEmpty().Max() + 1;

            using (_ctx)
            {
                var order = new Ordcli
                {
                    Id = 0000000000000000,
                    ...
                    OrderItems = model.OrderItems.Select((item, index) => new Riorcl
                    {
                        Id = index + lastId,
                        CodartVar = item.RoaCodvar == null ? item.RoaCodart : item.RoaCodart + "/" + item.RoaCodvar,
                        ...
                        IdFk = model.Id
                    }).ToList()
                };
                user.Orders.Add(order);

                using (var crypto = new RNGCryptoServiceProvider())
                {
                    int affectedRows = 0;
                    int retries = 5;

                    do
                    {
                        var pk = crypto.GeneraNumeroCompresoTra(100000000000000, 1000000000000000);
                        order.Id = pk;
                        foreach (var item in order.OrderItems)
                            item.IdFk = pk;
                        try
                        {
                            affectedRows = await _ctx.SaveChangesAsync();
                        }
                        catch (DbUpdateException) when (--retries >= 0)
                        {
                        }
                    } while (affectedRows == 0);
                }
            }

            return Ok("order added");
        }



Volevo chiederti se ha senso generare con javascript un random e passarlo al controller per poi usare un random generato da c#

ps: ho preso il tuo corso su udemy...dovresti mostrare di piu il gatto:)
Modificato da jjchuck il 05 maggio 2019 13:15 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.