实体框架代码首先针对具有动态添加的实体的上下文进行迁移

时间:2016-01-31 14:37:50

标签: entity-framework

我有一个数据上下文,我在运行时发现实体。在我的OnModelCreating方法中,我遍历EntityTypeConfiguration<>的所有子类,并将它们添加到DbModelBuilder

启用此上下文的迁移后,如果我调用Add-Migration来创建初始迁移,我将获得空的Up和Down方法。

在运行时向DbContext添加实体时,是否可以使用Add-Migration以便自动生成迁移代码,还是必须手动编写所需的迁移代码?

EntityTypeConfiguration调用参数较少的构造函数时,我需要找出一种传递Add-Migration所需列表的方法。

这是代码

 public class GenericSQLDBContext: DbContext
 {
    protected List<Type> _dataMapTypes;

    public new IDbSet<TEntity> Set<TEntity>() where TEntity : class
    {
        return base.Set<TEntity>();
    }

    #region OnModelCreating
    /// <summary>
    /// This method loads all the *Map files in the assembly
    /// </summary>
    /// <param name="modelBuilder"></param>
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        if (_dataMapTypes != null && _dataMapTypes.Count > 0)
        {
            var typesToRegister = _dataMapTypes.Where(type => !String.IsNullOrEmpty(type.Namespace))
            .Where(type => type.BaseType != null && type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>));
            foreach (var type in typesToRegister)
            {
                dynamic configurationInstance = Activator.CreateInstance(type);
                modelBuilder.Configurations.Add(configurationInstance);
            }
        }
        base.OnModelCreating(modelBuilder);
    } 

    public GenericSQLDBContext(List<Type> listOfMaps) : base()
    {
        _dataMapTypes = listOfMaps;
    }
 }

2 个答案:

答案 0 :(得分:0)

没有生成任何内容的原因是因为您可能没有定义DbSet<TEntity>属性...

示例......

public class ExampleContext : DbContext
{
    public ExampleContext() : base("ExampleDbConnection"){}

    public DbSet<Foo> Foos { get; set; }
}

我还没有测试上面的代码只是在这里动态编写它...但它应该工作...在那里看到类型DbSet的属性,这是你可能会遗漏的...如果没有看到你的代码,真的不能说更多

答案 1 :(得分:0)

您可以在运行时进行自动迁移

var config = new DbMigrationsConfiguration<MyContext> { AutomaticMigrationsEnabled = true }; 
var migrator = new DbMigrator(config); 
migrator.Update();

有关在实体框架中在运行时动态构建模型的更多详细信息,请查看以下链接: http://dynamicef.codeplex.com/