【问题标题】:EntityFramework.Plus: One or more validation errors were detected during model generationEntityFramework.Plus:在模型生成过程中检测到一个或多个验证错误
【发布时间】:2018-08-27 03:52:09
【问题描述】:

我在 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\n审核: EntityType:EntitySet 'Audits' 基于类型 'Audit',没有 已定义键。\r\n", "exceptionType": "System.Data.Entity.ModelConfiguration.ModelValidationException"

审计不是我项目中的实体 - 如错误所述。当我删除上面的代码时,这个错误就被删除了。

有人可以帮忙吗?是否可以禁止外部库类型的模型验证?

提前致谢

HS

【问题讨论】:

    标签: c# entity-framework entity-framework-6 entity-framework-plus


    【解决方案1】:

    免责声明:我是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; }
            }
        }
    }
    

    【讨论】:

    • 嗨,乔纳森,感谢您的快速回复。您不会相信这一点,但项目中没有其他 DbSet !事实上,审计甚至不存在。那是您的代码现在已替换的旧审计实体。是否有任何缓存的地方 - 可能是实体框架元数据缓存?另外,只有在我引入上面的代码时才会发生这种情况。如果我删除新的审计代码,我会收到这个错误。
    • 嗨乔纳森,很抱歉我的回复迟了。我已经设法让它工作了,我通过从头开始重建整个 WebApi 项目并复制代码和配置来实现这一点。一定有一些奇怪的缓存问题正在缓存旧模型。感谢您的帮助和勤奋。
    • 嗨@JonathanMagnan,我可以在特定时间检索记录的最佳方法是什么。我只看到调用SaveChanges() 后检索数据的代码,但我想在读取数据时检索历史记录?
    • 您能否详细说明but I want to retrieve the history while reading data?。我只是想确保我回答正确的问题
    • @KnowHoper 你到底做了什么?我面临同样的问题。但就我而言,我在过去创建了另一个同名实体以及第二个 DBContext。现在我的项目卡住了。实际上是一个管理多对多关系的实体。我快疯了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2014-03-07
    • 2013-02-13
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多