30 messaggi dal 30 gennaio 2014
Buongiorno.
Ho un problemino con EFCore nel salvare un record nella tabella madre ed in quella figlia collegate da FK
La mia tabella madre è:
 public partial class CCodes
    {
       public CCodes()
        {
            CodesOwners = new HashSet<CCodesOwner>();
        }
        public int Id { get; set; }
        public int? IdCertification { get; set; }
        public int? Category { get; set; }
        public DateTime DataEmissione { get; set; }
        public int? Inseritore { get; set; }
        public int? IdBrevetto { get; set; }
        public int? IdLinea { get; set; }
        [StringLength(2)]
        public string Lpic { get; set; }
        public int Apic { get; set; }
        public int Npic { get; set; }
        public bool Archiviato { get; set; }
        public bool Digitale { get; set; }

        public virtual Linee PicLine { get; set; }
        public virtual ICollection<CCodesOwner> CodesOwners { get; set; }
        public Brevetti? BrevettoPic { get; set;}
        public Certifications? CertificationPic { get; set; }
        public Anagrafica? InseritorePic { get; set; }
        public CertificationLevel CategoriaPic { get; set; }

    }


La figlia:

 public partial class CCodesOwner
    {
        public int Id { get; set; }
        public int IdCode { get; set; }
        public int IdCreatore { get; set; }
        public int IdAssegnatario { get; set; }
        public int TipoAssegnazione { get; set; }
        public DateTime DataAssegnazione { get; set; }
        public DateTime DataTrasmissione { get; set; }
        public int IdTrasmettitore { get; set; }

        public virtual CCodes CCode { get; set; }
        public Anagrafica Assegnatario { get; set; }
        public Anagrafica? Trasmettitore { get; set; }
    }

il dbContext:

modelBuilder.Entity<CCodes>(
                entity =>
                {
                    entity.ToTable("t_pics");
                    entity.HasKey(c => c.Id);
                    entity.Property(c => c.DataEmissione).HasDefaultValueSql("current_timestamp");
                    entity.Property(c => c.IdBrevetto).HasDefaultValue(0);
                    entity.HasOne(c => c.PicLine).WithMany(l => l.CodeLines).HasForeignKey(c => c.IdLinea);
                    entity.Navigation(c => c.PicLine).AutoInclude();
                    entity.HasOne(c => c.BrevettoPic).WithMany(c => c.CCode).HasForeignKey(c => c.IdBrevetto);
                    entity.HasOne(c => c.CertificationPic).WithMany(c => c.CCode).HasForeignKey(c => c.IdCertification);
                    entity.Navigation(c => c.CertificationPic).AutoInclude();
                    entity.HasOne(a => a.InseritorePic).WithMany(c => c.CCodeIssuer).HasForeignKey(a => a.Inseritore);
                    entity.Navigation(c => c.InseritorePic).AutoInclude();
                    entity.HasOne(c => c.CategoriaPic).WithMany(c => c.CCodesCategory).HasForeignKey(c => c.Category);
                    entity.Navigation(c => c.CategoriaPic).AutoInclude();
                    entity.HasMany(c => c.CodesOwners).WithOne(c => c.CCode).HasForeignKey(o => o.IdAssegnatario);
                    entity.Property(c => c.Archiviato).HasConversion<int>();
                    entity.Property(c => c.Digitale).HasConversion<int>();
                    
                });
            modelBuilder.Entity<CCodesOwner>(
                entity =>
                {
                    entity.ToTable("t_pics_assegnazioni");
                    entity.HasKey(c =>c.Id);
                    entity.HasOne(c => c.Assegnatario).WithMany(a => a.CCodesOwner).HasForeignKey(c => c.IdAssegnatario);
                    entity.HasOne(c => c.Trasmettitore).WithMany(a => a.CCodeSender).HasForeignKey(c => c.IdTrasmettitore);
                });


Il Model che mi va a salvare i dati (metto solo la parte di codice che ritengo necessaria, non la valorizzazione delle varie variabili):
CCodes Codice = new()
                {
                    Npic = PrimoDisponibile,
                    Apic = anno,
                    Lpic = lpic,
                    DataEmissione = DateTime.Now,
                    IdLinea = model.IdLinea,
                    IdBrevetto = 0,
                    IdCertification = model.IdCertification,
                    Category = model.Category,
                    Inseritore = model.Creatore,
                    Digitale = model.IsDigital == 0 ? false : true

                };
                Codice.CodesOwners.Add(new CCodesOwner()
                    {
                        IdAssegnatario = model.Destinatario,
                        DataAssegnazione = DateTime.Now,
                        IdCreatore = model.Creatore
                });
                
                dbContext.Add(Codice);
                await dbContext.SaveChangesAsync();

Stando a quello che ho trovato in rete per come sono configurate le entità EFCore dovrebbe inserire nella tabella madre (CCodes) reperire l'Id inserito ed assegnarlo alla FK della tabella figlia, ma di fatto non è così, non inserisce neppure l'entità madre.
D'altro canto se escludo l'inserimento dell'entità figlia funziona.
Ci sto sbattendo la testa...

Quello che segue è l'output del debug:
Microsoft.EntityFrameworkCore.Database.Command: Information: Executed DbCommand (13ms) [Parameters=[@p0='3', @p1='0', @p2='1' (Nullable = true), @p3='2023-06-26T17:48:08.8406130+02:00' (DbType = DateTime), @p4='0', @p5='0' (Nullable = true), @p6='5' (Nullable = true), @p7='1' (Nullable = true), @p8='31456' (Nullable = true), @p9='BA' (Nullable = false) (Size = 2), @p10='3'], CommandType='Text', CommandTimeout='30']
INSERT INTO `t_pics` (`Apic`, `Archiviato`, `Category`, `DataEmissione`, `Digitale`, `IdBrevetto`, `IdCertification`, `IdLinea`, `Inseritore`, `Lpic`, `Npic`)
VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8, @p9, @p10);
SELECT `Id`
FROM `t_pics`
WHERE ROW_COUNT() = 1 AND `Id` = LAST_INSERT_ID();
Eccezione generata: 'MySqlConnector.MySqlException' in MySqlConnector.dll
Eccezione generata: 'MySqlConnector.MySqlException' in System.Private.CoreLib.dll
Eccezione generata: 'MySqlConnector.MySqlException' in System.Private.CoreLib.dll
Eccezione generata: 'MySqlConnector.MySqlException' in MySqlConnector.dll
Eccezione generata: 'MySqlConnector.MySqlException' in System.Private.CoreLib.dll
Eccezione generata: 'MySqlConnector.MySqlException' in System.Private.CoreLib.dll
Eccezione generata: 'MySqlConnector.MySqlException' in System.Private.CoreLib.dll
Eccezione generata: 'MySqlConnector.MySqlException' in System.Private.CoreLib.dll
Microsoft.EntityFrameworkCore.Database.Command: Error: Failed executing DbCommand (887ms) [Parameters=[@p11='2023-06-26T17:48:11.7524350+02:00' (DbType = DateTime), @p12='0001-01-01T00:00:00.0000000' (DbType = DateTime), @p13='25816', @p14='0', @p15='31456', @p16='0', @p17='0'], CommandType='Text', CommandTimeout='30']
INSERT INTO `t_pics_assegnazioni` (`DataAssegnazione`, `DataTrasmissione`, `IdAssegnatario`, `IdCode`, `IdCreatore`, `IdTrasmettitore`, `TipoAssegnazione`)
VALUES (@p11, @p12, @p13, @p14, @p15, @p16, @p17);
SELECT `Id`
FROM `t_pics_assegnazioni`
WHERE ROW_COUNT() = 1 AND `Id` = LAST_INSERT_ID();

A questo punto mi genera l'errore di FK nella tabella child perchè non ha la chiave esterna...
Ho provato e escludendo questa parte del model:
 Codice.CodesOwners.Add(new CCodesOwner()
                    {
                        IdAssegnatario = model.Destinatario,
                        DataAssegnazione = DateTime.Now,
                        IdCreatore = model.Creatore
                });

Inserisce nella tabella madre...
Se qualche anima pia riesce a farmi capire dove sto cannando...
Grazie in anticipo

Valter
30 messaggi dal 30 gennaio 2014
Scusate il post compulsivo....
Se sbaglio il puntamento all'indice col cavolo che mi inserisce il record rispettando il vincolo della foreign key:

entity.HasMany(c => c.CodesOwners).WithOne(c => c.CCode).HasForeignKey(o => o.IdAssegnatario);


invece doveva essere:
entity.HasMany(c => c.CodesOwners).WithOne(c => c.CCode).HasForeignKey(o => o.IdCode);

Valter

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.