EF6xを使用したMVC5プロジェクトをMVCコアおよびEFコアに移動し始めたばかりですが、エンティティの構成に大きな問題があります。 EF6 Fluent構成をEFコアに移行するにはどうすればよいですか?
可能であればサンプル付きのガイドが必要です。
ここに私のマッピングクラスの1つと私の試みがあります
EntityMappingConfiguratuin
public interface IEntityMappingConfiguration
{
void Map(ModelBuilder b);
}
public interface IEntityMappingConfiguration<T> : EntityMappingConfiguration where T : class
{
void Map(EntityTypeBuilder<T> builder);
}
public abstract class EntityMappingConfiguration<T> : EntityMappingConfiguration<T> where T : class
{
public abstract void Map(EntityTypeBuilder<T> b);
public void Map(ModelBuilder b)
{
Map(b.Entity<T>());
}
}
public static class ModelBuilderExtenions
{
private static IEnumerable<Type> GetMappingTypes(this Assembly assembly, Type mappingInterface)
{
return Assembly.GetTypes().Where(x => !x.IsAbstract && x.GetInterfaces().Any(y => y.GetTypeInfo().IsGenericType && y.GetGenericTypeDefinition() == mappingInterface));
}
public static void AddEntityConfigurationsFromAssembly(this ModelBuilder modelBuilder, Assembly assembly)
{
var mappingTypes = Assembly.GetMappingTypes(typeof(IEntityMappingConfiguration<>));
foreach (var config in mappingTypes.Select(Activator.CreateInstance).Cast<IEntityMappingConfiguration>())
{
config.Map(modelBuilder);
}
}
}
DbContext
public class CommerceServiceDbContext : AbpDbContext
{
public CommerceServiceDbContext(DbContextOptions<CommerceServiceDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.AddEntityConfigurationsFromAssembly(GetType().Assembly);
}
}
シンプルな古い設定
public partial class AffiliateMap : EntityMappingConfiguration<Affiliate>
{
public override void Map(EntityTypeBuilder<Affiliate> b)
{
b.ToTable("Affiliate");
b.HasKey(a => a.Id);
b.HasRequired(a => a.Address).WithMany().HasForeignKey(x => x.AddressId).WillCascadeOnDelete(false);
}
}
マイトライ
public partial class AffiliateMap : EntityMappingConfiguration<Affiliate>
{
public override void Map(EntityTypeBuilder<Affiliate> b)
{
b.ToTable("Affiliate");
b.HasKey(a => a.Id);
b.HasOne(a => a.Address)
.WithMany().HasForeignKey(x => x.AddressId).IsRequired().OnDelete(DeleteBehavior.Restrict);
}
}
これは、Google検索とMicrosoftドキュメントを使用して行いました。しかし、自分の仕事はよくわかりません。 +100の構成クラスがあるので、続行する前に確認します。質問の内容がサイトの利用規約に適合していない場合は、お詫び申し上げます。
EFコアへの移行に関する良い記事を見つけました。私はそれを共有し、私のような初心者のためにこの質問を続けたいと思います。
コードの更新
名前空間_System.Data.Entity
_は_Microsoft.EntityFrameworkCore
_に置き換えられましたHasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
はValueGeneratedNever();
に置き換えられましたDbContext
のベースコンストラクターには、接続文字列用の単一の文字列パラメーターがありません。 DbContextOptions
を注入する必要がありますOnModelCreating(DbModelBuilder modelBuilder)
はOnModelCreating(ModelBuilder modelBuilder)
になります。単純な変更ですが、すべて同じように変更しますmodelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
は使用できなくなりました。つまり、EntityTypeConfiguration
も使用できないため、すべてのエンティティ構成をOnModelCreating
に移動する必要がありました。
_((IObjectContextAdapter)context).ObjectContext.ObjectMaterialized
_は使用できなくなりました。私はそれを使用してDbContext
を拡張し、すべての日付をUtcに変換しました。その代替品はまだ見つけていません。ComplexType
は使用できなくなりました。これに対応するために、モデル構造を少し変更する必要がありました。MigrateDatabaseToLatestVersion
は使用できなくなったため、startup.csに以下を追加する必要がありました
_using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
serviceScope.ServiceProvider.GetService<SbDbContext>().Database.Migrate();
}
_
WillCascadeOnDelete(false)
はOnDelete(DeleteBehavior.Restrict)
になりますHasOptional
は投稿ごとに関連しなくなりましたIDbSet
はDbSet
になりますDbSet<T>.Add()
はT
ではなく_EntityEntry<T>
_を返します
_var entry = context.LearningAreaCategories.Add(new LearningAreaCategory());
//that's if you need to use the entity afterwards
var entity = entry.Entity;
_
IQueryable<T>.Include(Func<>)
は、_IIncludableQueryable<T,Y>
_ではなく_IQueryable<T>
_を返すようになりました。同じことがOrderBy
にも当てはまります。私がしたことは、すべてのインクルードとオーダーバイを最後に移動することでした。
出典: EF6からEF Coreへの移行