[英]Moving from EF6 to EF Core 2.0
我剛剛開始將我的MVC5項目與EF6x一起移植到MVC Core和EF Core,但我的實體配置存在很大問題。 如何將EF6 Fluent配置遷移到EF核心?
如果可能的話,我需要帶樣本的指南。
這是我的一個映射類和我的嘗試
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);
}
}
我使用谷歌搜索和微軟文檔完成了這項工作。 但我不確定我的工作。 由於我有+100配置類,我會在繼續之前問你。 如果我的問題內容與網站的條款和條件不符,我深表歉意。
我發現了一篇關於遷移到EF核心的好文章。 我希望與像我這樣的初學者分享並保留這個問題。
代碼更新
命名空間System.Data.Entity
由Microsoft.EntityFrameworkCore
替換
HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)
由ValueGeneratedNever();
替換ValueGeneratedNever();
DbContext
的基本構造DbContext
沒有連接字符串的單個字符串參數。 我們現在必須注入DbContextOptions
OnModelCreating(DbModelBuilder modelBuilder)
OnModelCreating(ModelBuilder modelBuilder)
成為OnModelCreating(ModelBuilder modelBuilder)
。 簡單的改變,但改變都一樣
modelBuilder.Configurations.AddFromAssembly(Assembly.GetExecutingAssembly());
不再可用,這意味着EntityTypeConfiguration
也不可用,所以我不得不將我的所有實體配置移動到OnModelCreating
((IObjectContextAdapter)context).ObjectContext.ObjectMaterialized
不再可用。 我正在使用它來擴展DbContext
以將out中的所有日期轉換為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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.