EntityFramework.Plus: одна или несколько ошибок проверки были обнаружены во время генерации модели

Я использую функцию аудита EntityFramework.Plus в проекте EF6 Code First. Когда я добавляю следующий код:

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}");
            };
        }

Я получаю следующую ошибку:

Во время генерации модели была обнаружена одна или несколько ошибок проверки:\r\n\r\nWebsite.Core.Entities.Audit:: EntityType 'Audit' не определен ключ. Определите ключ для этого EntityType.\ R \nAudits: EntityType: EntitySet 'Audits' основан на типе 'Audit', для которого не определены ключи. \ R \n", "exceptionType": "System.Data.Entity.ModelConfiguration.ModelValidationException"

Аудит не является юридическим лицом в моем проекте - как указано в ошибке. Эта ошибка удаляется при удалении кода выше.

Кто-нибудь может помочь? Можно ли подавить проверку модели для внешних типов библиотек?

заранее спасибо

HS

1 ответ

Отказ от ответственности: я владелец http://entityframework-plus.net/

Глядя на ошибку:

EntityType 'Audit' не определен ключ

Кажется, вы также сопоставили объект аудита, который не должен отображаться.

Посмотрите на свой EntityContext, если у вас есть строка, подобная этой, и удалите ее:

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

Ответить на под-вопросы

У нас есть класс Audit в нашей библиотеке, но чтобы он появился в контексте, он должен быть отображен (что нам не нужно). Отладить эту проблему довольно сложно, поскольку вы единственный, кто ее получил.

Можете ли вы попробовать следующий код в новом проекте и текущем? В обоих случаях все должно работать без проблем.

Если вы можете, попробуйте предоставить больше информации, чтобы мы могли воспроизвести эту проблему.

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; }
        }
    }
}
Другие вопросы по тегам