Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EntityFramework.Plus:在模型生成过程中检测到一个或多个验证错误_C#_Entity Framework_Entity Framework 6_Entity Framework Plus - Fatal编程技术网

C# EntityFramework.Plus:在模型生成过程中检测到一个或多个验证错误

C# EntityFramework.Plus:在模型生成过程中检测到一个或多个验证错误,c#,entity-framework,entity-framework-6,entity-framework-plus,C#,Entity Framework,Entity Framework 6,Entity Framework Plus,我正在EF6代码优先项目中使用EntityFramework.Plus的审计功能。当我添加以下代码时: public virtual DbSet<AuditEntry> AuditEntries { get; set; } public virtual DbSet<AuditEntryProperty> AuditEntryProperties { get; set; } static EntityContext() { AuditMan

我正在EF6代码优先项目中使用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}");
            };
        }
公共虚拟数据库集审核条目{get;set;}
公共虚拟DbSet AuditEntryProperties{get;set;}
静态EntityContext()
{
AuditManager.DefaultConfiguration.AutoSavePreAction=(上下文,审核)=>
{
var Entities=作为EntityContext的上下文;
if(实体!=null)
{
Entities.AuditEntries.AddRange(audit.Entries);
}
else抛出新的InvalidOperationException({Context.Database.Connection}的$“Context为null”);
};
}
我得到以下错误:

在建模过程中检测到一个或多个验证错误 生成:\r\n\r\nWebsite.Core.Entities.Audit::EntityType“Audit” 没有定义键。定义此EntityType的键。\r\n默认值: EntityType:EntitySet“Audits”基于没有 已定义键。\r\n“exceptionType”: “System.Data.Entity.ModelConfiguration.ModelValidationException”

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

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

提前谢谢


HS

免责声明:我是

查看错误:

EntityType“Audit”未定义键

您似乎还映射了不应映射的审核实体

查看EntityContext,如果您有类似的行,请将其删除:

public virtual DbSet<Audit> Audits { get; set; }
公共虚拟数据库集审核{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; }
        }
    }
}
使用系统;
使用System.Data.Entity;
使用System.Windows.Forms;
命名空间Z.EntityFramework.Plus.Lab
{
公共部分类表格(发布)(审核)(HeySatan):表格
{
公共表格(发布)(审计)(海桑坦)
{
初始化组件();
使用(var ctx=new EntityContext())
{
var audit=新审计();
添加(新的EntitySimple{ColumnInt=1});
保存更改(审计);
}
}
公共类EntityContext:DbContext
{
静态EntityContext()
{
AuditManager.DefaultConfiguration.AutoSavePreAction=(上下文,审核)=>
{
var Entities=作为EntityContext的上下文;
if(实体!=null)
{
Entities.AuditEntries.AddRange(audit.Entries);
}
else抛出新的InvalidOperationException({Context.Database.Connection}的$“Context为null”);
};
}
公共EntityContext():基(“CodeFirstEntities”)
{
}
公共DbSet EntitySimples{get;set;}
公共虚拟数据库集审核项{get;set;}
公共虚拟DbSet AuditEntryProperties{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Types().Configure(x=>x.ToTable(GetType().DeclaringType!=null?GetType().DeclaringType.FullName.Replace(“.”,“”)+““+x.ClrType.Name:”);
基于模型创建(modelBuilder);
}
}
公共类EntitySimple
{
公共int Id{get;set;}
公共int?ColumnInt{get;set;}
}
}
}

嘿,Johnathan,谢谢你的快速回复。你不会相信这一点,但项目中没有其他数据库集!事实上,审计根本不存在。那是我以前的审计实体,你的代码现在已经替换了。有没有可能缓存到任何地方-实体框架元数据缓存?而且,只有当我输入生成上面的代码。如果我删除了新的审核代码,就会出现此错误。嗨,Jonathan,很抱歉我的响应太晚。我已经设法让它工作了,我通过从头开始重建整个WebApi项目,并复制代码和配置来实现这一点。缓存旧模式时一定出现了一些奇怪的缓存问题l、 感谢您的帮助和努力。嗨@JonathanMagnan,在特定时间检索记录的最佳方式是什么。我只看到调用
SaveChanges()后检索数据的代码
但我想在读取数据时检索历史记录?您能详细说明一下
但我想在读取数据时检索历史记录吗?
。我只想确保回答正确question@KnowHoper你到底做了什么?我面临着同样的问题。但就我而言,我在过去创建了另一个同名实体还有第二个DBContext。现在我的项目被卡住了。实际上是一个管理多对多关系的实体。我快疯了。