我有一个数据上下文,我在运行时发现实体。在我的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;
}
}
答案 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/