Я использую функцию аудита 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; }
}
}
}