私はEF Core DbFirstアプローチを使用しています。私のdbContextはScaffold-DbContextコマンドによって自動的に作成されます。
追加のDbSetsをdbContextに追加し、dbContextのOnModelCreatingメソッドにいくつかの追加コードを追加する必要がありますが、追加されたコードが削除されるたびに、毎回追加する必要があります。
私がしたいのは、別の部分的なdbContextクラスを作成し、 保護されたオーバーライドvoid OnModelCreating(ModelBuilder modelBuilder)を部分メソッドとしてマークすることです
しかし、エラーが発生する:
ここに擬似コードがあります:
MyDbContext1.cs - Scaffold-DbContextによって生成されます。
public partial class MyDbContext : DbContext
{
public MyDbContext()
{
}
public MyDbContext(DbContextOptions<MyDbContext> options)
: base(options)
{
}
public virtual DbSet<Client> Clients { get; set; }
protected override partial void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Client>(entity =>
{
// ... some code
}
}
}
MyDbContext2.cs - スキャフォールディング後に毎回dbContextに追加したこのコード:
public partial class MyDbContext
{
public virtual DbSet<JustAnotherEntity> AnotherEntity { get; set; }
protected override partial void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<JustAnotherEntity>(entity =>
{
entity.HasKey(e => new {e.Id, e.IdAction, e.IdState})
.ForSqlServerIsClustered(false);
});
}
}
別の方法としては、MyDbContextから継承したコンテキストクラスをもう1つ作成し、それに実際にすべてのカスタムコードを含めることができます。そして、この新しいクラスをコンテキストとして使います。このようにして、生成されたコードを更新する必要はありません。
public class MyDbContext2 : MyDbContext
{
public MyDbContext2()
{
}
public MyDbContext2(DbContextOptions<MyDbContext> options)
: base(options)
{
}
public virtual DbSet<JustAnotherEntity> AnotherEntity { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<JustAnotherEntity>(entity =>
{
entity.HasKey(e => new {e.Id, e.IdAction, e.IdState})
.ForSqlServerIsClustered(false);
});
}
}
これで、次のような部分クラスにOnModelCreatingPartial
を実装できます。
public partial class RRStoreContext : DbContext
{
partial void OnModelCreatingPartial(ModelBuilder builder)
{
builder.Entity<RepeatOrderSummaryView>().HasNoKey();
}
}
生成されたコンテキストファイルを見ると、最後に表示されます...
OnModelCreatingPartial(modelBuilder);
注:これは、ストアドプロシージャのHasNoKey
を手動で追加する必要があったために必要でした(カスタムの戻り値の型で、他の方法では足場を組んでいませんでした)。