IMPORTANT: MAJOR BREAKING CHANGE COMING SOON

EntityFramework.Plus:モデル生成中に1つ以上の検証エラーが検出されました

c# entity-framework entity-framework-6 entity-framework-plus

質問

私はEntityFramework.Plusの監査機能をEF6コードファーストプロジェクトで使用しています。次のコードを追加すると:

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}");
            };
        }

次のエラーが表示されます。

モデル生成中に1つ以上の検証エラーが検出されました:\ r \ n \ r \ nWebsite.Core.Entities.Audit :: EntityType 'Audit'にキーが定義されていません。このEntityTypeのキーを定義します。\ r \ n監査:EntityType:EntitySet 'Audits'は、キーが定義されていないタイプの「監査」に基づいています。\ r \ n "、" exceptionType ":" System.Data.Entity.ModelConfiguration。 ModelValidationException "

エラーは、私のプロジェクトのエンティティではありません。このエラーは、上記のコードを削除すると削除されます。

誰も助けることができますか?外部ライブラリタイプのモデル検証を抑制することは可能ですか?

前もって感謝します

HS

エキスパート回答

免責事項 :私はEntity Framework Plusの所有者です

エラーを見て:

EntityType '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; }
        }
    }
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow