0

我在EF6 Code First项目中使用EntityFramework.Plus的审计功能。当我添加以下代码: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}"); 
      }; 
     } 

我得到以下错误:

One or more validation errors were detected during model generation:\r\n\r\nWebsite.Core.Entities.Audit: : EntityType 'Audit' has no key defined. Define the key for this EntityType.\r\nAudits: EntityType: EntitySet 'Audits' is based on type 'Audit' that has no keys defined.\r\n", "exceptionType": "System.Data.Entity.ModelConfiguration.ModelValidationException"

审计是不是在我的项目的实体 - 由错误陈述。删除上面的代码时会删除此错误。

谁能帮助?是否可以抑制外部库类型的模型验证?

在此先感谢

HS

回答

1

免责声明:我的Entity Framework Plus

主人望着错误:

EntityType 'Audit' has no key defined

似乎也映射审核不应映射的实体。

看看你的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; } 
     } 
    } 
} 
+0

嘿,Johnathan,感谢您的快速回复。你不会相信这个,但项目中没有其他DbSet !事实上,审计甚至不存在。那是我的旧审计实体,您的代码现在已被替换。可以在任何地方缓存 - 实体框架元数据缓存可能吗?此外,这只发生在我介绍上述代码时。如果我删除了新的审计代码,则会出现此错误。 – KnowHoper

+0

你好@HeySatan,你成功了吗? –

+1

嘿乔纳森,我很遗憾我的迟到回应。我设法让它工作,我通过重新构建整个WebApi项目并复制代码和配置来实现这一目标。肯定有一些奇怪的缓存问题是缓存旧模型。感谢您的帮助和勤奋。 – KnowHoper

相关问题