我在EF6 Code First项目中使用EntityFramework.Plus的审核功能。当我添加以下代码时:
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&#39; Audit&#39; 没有定义键。定义此EntityType的键。\ r \ nAudits: EntityType:EntitySet&#39; Audits&#39;基于类型&#39;审计&#39;没有 键定义。\ r \ n&#34;,&#34; exceptionType&#34;: &#34; System.Data.Entity.ModelConfiguration.ModelValidationException&#34;
审计不是我项目中的实体 - 如错误所述。删除上面的代码时会删除此错误。
有人可以帮忙吗?是否可以抑制外部库类型的模型验证?
提前致谢
HS
答案 0 :(得分:2)
免责声明:我是Entity Framework Plus
的所有者查看错误:
EntityType'Audit'没有键定义
您似乎还映射了不应映射的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; }
}
}
}