EntityFramework.Plus: uno o più errori di convalida sono stati rilevati durante la generazione del modello

c# entity-framework entity-framework-6 entity-framework-plus

Domanda

Sto utilizzando la funzionalità di controllo di EntityFramework.Plus in un progetto EF6 Code First. Quando aggiungo il seguente codice:

public virtual DbSet<AuditEntry> AuditEntries { get; set; }

public virtual DbSet<AuditEntryProperty> AuditEntryProperties { get; set; }

static EntityContext()
   {
            AuditManager.DefaultConfiguration.AutoSavePreAction = (context, audit) =>
            {
                var Entities = context as EntityContext;
                if (Entities != null)
                {
                    Entities.AuditEntries.AddRange(audit.Entries);
                }
                else throw new InvalidOperationException($"Context is null for {context.Database.Connection}");
            };
        }

Ottengo il seguente errore:

Uno o più errori di convalida sono stati rilevati durante la generazione del modello: \ r \ n \ r \ nWebsite.Core.Entities.Audit:: EntityType 'Audit' non ha una chiave definita. Definisci la chiave per questo EntityType. \ R \ nAudits: EntityType: EntitySet 'Audits' è basato sul tipo 'Audit' che non ha chiavi definite. \ R \ n "," exceptionType ":" System.Data.Entity.ModelConfiguration. ModelValidationException"

L'audit non è un'entità nel mio progetto, come affermato dall'errore. Questo errore viene rimosso quando rimuovo il codice sopra.

Qualcuno può aiutare? È possibile sopprimere la convalida del modello per i tipi di librerie esterne?

Grazie in anticipo

HS

Risposta esperta

Disclaimer : sono il proprietario di Entity Framework Plus

Guardando l'errore:

EntityType 'Audit' non ha una chiave definita

Sembra che tu abbia mappato anche l'entità Audit che non dovrebbe essere mappata.

Guarda il tuo EntityContext se hai una riga simile a questa e rimuovila:

public virtual DbSet<Audit> Audits { get; set; }

Rispondi alle domande secondarie

Abbiamo la classe Audit nella nostra libreria, ma per farla apparire nel contesto, dovrebbe essere mappata (cosa che non vogliamo). È piuttosto difficile eseguire il debug di questo problema poiché sei l'unico a ottenerlo.

Puoi provare il seguente codice in un nuovo progetto e quello attuale? In entrambi i casi, dovrebbe funzionare senza problemi.

Se puoi, prova a fornire ulteriori informazioni per permetterci di riprodurre questo problema.

using System;
using System.Data.Entity;
using System.Windows.Forms;

namespace Z.EntityFramework.Plus.Lab
{
    public partial class Form_Issue_Audit_HeySatan : Form
    {
        public Form_Issue_Audit_HeySatan()
        {
            InitializeComponent();

            using (var ctx = new EntityContext())
            {
                var audit = new Audit();

                ctx.EntitySimples.Add(new EntitySimple {ColumnInt = 1});

                ctx.SaveChanges(audit);
            }
        }

        public class EntityContext : DbContext
        {
            static EntityContext()
            {
                AuditManager.DefaultConfiguration.AutoSavePreAction = (context, audit) =>
                {
                    var Entities = context as EntityContext;
                    if (Entities != null)
                    {
                        Entities.AuditEntries.AddRange(audit.Entries);
                    }
                    else throw new InvalidOperationException($"Context is null for {context.Database.Connection}");
                };
            }

            public EntityContext() : base("CodeFirstEntities")
            {
            }

            public DbSet<EntitySimple> EntitySimples { get; set; }
            public virtual DbSet<AuditEntry> AuditEntries { get; set; }
            public virtual DbSet<AuditEntryProperty> AuditEntryProperties { get; set; }

            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.Types().Configure(x => x.ToTable(GetType().DeclaringType != null ? GetType().DeclaringType.FullName.Replace(".", "_") + "_" + x.ClrType.Name : ""));

                base.OnModelCreating(modelBuilder);
            }
        }

        public class EntitySimple
        {
            public int Id { get; set; }
            public int? ColumnInt { get; set; }
        }
    }
}


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché