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

相關問題