私はdbコンテキストで直接動作するRazorページのWebアプリに取り組んでいます...はい、これは理想的ではありませんが、当分の間私が立ち往生しているものです。
データモデルでは、各オブジェクトは監査データを含む基本エンティティクラスから継承します。例:
public class BaseEntity
{
[Key]
public int Id { get; set; }
public DateTime CreatedOn { get; set; }
public string CreatedBy { get; set; }
...etc.
public class Table1 : BaseEntity
{
public string TestItemName { get; set; }
}
データベースで、CreatedByを必須(nullではない)にしたいのですが、[Required]属性を使用したくないのは、これによりUIがトリガーされてCreatedBy列が検証されるためです。この列をUIに公開したくないので、代わりに、追加/挿入に基づいてすべての監査プロパティを更新するサービスコードを用意します。
私が探しているのは、Fluent APIを介した方法で、必要なデータベースの列タイプ(NVARCHAR(MAX)NOT NULLなど)を取得します。
これは、dbcontextのOnModelCreatingメソッドで実行できます。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Table1>()
.Property(o => o.CreatedBy)
.IsRequired();
ただし、これには、モデル内のすべてのテーブルに対して同様のエントリを作成する必要があります。
すべてのエンティティに対してこれを実現できるOnModelCreatingで使用できるコードはありますか?このようなもの(これは単なる擬似コードですが、アイデアを提供しようとしています):
var entityTypes = modelBuilder.Model.GetEntityTypes().Select(o => o.GetType()).ToList();
entityTypes.ForEach(e =>
{
e.Property("CreatedBy").IsRequired();
});
を実装する個別のクラスにエンティティ構成を実装しますIEntityTypeConfiguration
。実装は、構成する基本実装から継承する必要がBaseEntity
あり、Configure
メソッドは仮想であり、基本クラスのメソッドを呼び出す実装をオーバーライドする必要があります。
public abstract class BaseEntityConfiguration<TEntity>
: IEntityTypeConfiguration<TEntity>
where TEntity : BaseEntity
{
public virtual void Configure(EntityTypeBuilder<TEntity> builder)
{
builder.Property(be => be.CreatedBy)
.IsRequired();
// etc
}
}
public class SomeEntityConfiguration : BaseEntityConfiguration<SomeEntity>
{
public override void Configure(EntityTypeBuilder<SomeEntity> builder)
{
// call base class method to configure BaseEntity properties
base.Configure(builder);
// configure remaining SomeEntity-specific properties/etc
builder.TestItemName.IsRequired();
}
}
構成クラスを使用するようにモデルビルダーに通知する必要があります。たとえば、構成クラスがDbContext
:と同じアセンブリにある場合
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(
typeof(YourDbContext).Assembly);
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加