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