我在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'Audit'沒有定義鍵。定義此EntityType的鍵。\ r \ nAudits:EntityType:EntitySet'Auditits'基於類型'Audit',沒有定義鍵。\ r \ n“,”exceptionType“:”System.Data.Entity.ModelConfiguration。 ModelValidationException“
審計不是我項目中的實體 - 如錯誤所述。刪除上面的代碼時,將刪除此錯誤。
有人可以幫忙嗎?是否可以抑制外部庫類型的模型驗證?
提前致謝
HS
免責聲明 :我是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; }
}
}
}