IMPORTANT: MAJOR BREAKING CHANGE COMING SOON

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

c# entity-framework entity-framework-6 entity-framework-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 «Аудит» основан на типе «Аудит», который не имеет определенных ключей. \ R \ n "," exceptionType ":" System.Data.Entity.ModelConfiguration. ModelValidationException»

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

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

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

HS

Ответ эксперта

Отказ от ответственности : я являюсь владельцем Entity Framework Plus

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

EntityType «Аудит» не имеет определенного ключа

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

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

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

Ответные вопросы

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

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

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

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


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему