gpt4 book ai didi

c# - Entity Framework 自动更新

转载 作者:太空狗 更新时间:2023-10-29 17:47:44 24 4
gpt4 key购买 nike

我尝试在我的项目中实现 Entity Framework !我的项目是基于插件的,所以我不知道我必须将哪个对象保存到数据库中。

我是这样实现的:

public class DatabaseContext : DbContext
{
public DatabaseContext() : base()
{
Database.Initialize(true);
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
foreach( PluginDto plugin in BackendContext.Current.PluginManager._plugins) {
foreach(Type obj in plugin.plugin.getPluginDatabaseObjects())
{
Type typ = typeof(EntityTypeConfiguration<>).MakeGenericType(obj);

List<MethodInfo> l = modelBuilder.GetType().GetMethods().ToList<MethodInfo>();

MethodInfo m_Entitiy = modelBuilder.GetType().GetMethod("Entity").MakeGenericMethod(new Type[] { obj });
var configObj = m_Entitiy.Invoke(modelBuilder, null);

MethodInfo m_ToTable = configObj.GetType().GetMethod("ToTable", new Type[] { typeof(String) });
m_ToTable.Invoke(configObj, new object [] { obj.Name });
}
}

base.OnModelCreating(modelBuilder);
}

}

但是当我进行更改时,我得到了这个异常:

The model backing the 'DatabaseContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).

这个错误是完全合乎逻辑的。数据库不同步,但我将如何获得更新?我读过一些关于这个的东西:

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

但我不知道如何以及在哪里正确使用它!非常感谢!

编辑1:当我尝试:Enable-Migrations –EnableAutomaticMigrations

我遇到了这个错误:

System.NullReferenceException: Object reference not set to an instance of an object.
at SOM.Backend.database.DatabaseContext.OnModelCreating(DbModelBuilder modelBuilder) in C:\Users\Flo\Documents\Visual Studio 2015\Projects\SOM\Backend\BackendService\BackendService\database\DatabaseContext.cs:line 26
at System.Data.Entity.Internal.LazyInternalContext.CreateModelBuilder()
at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
at System.Data.Entity.Internal.LazyInternalContext.MarkDatabaseInitialized()
at System.Data.Entity.Database.Initialize(Boolean force)
at SOM.Backend.database.DatabaseContext..ctor() in C:\Users\Flo\Documents\Visual Studio 2015\Projects\SOM\Backend\BackendService\BackendService\database\DatabaseContext.cs:line 21
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Data.Entity.Infrastructure.DbContextInfo.CreateInstance()
at System.Data.Entity.Infrastructure.DbContextInfo..ctor(Type contextType, DbProviderInfo modelProviderInfo, AppConfig config, DbConnectionInfo connectionInfo, Func`1 resolver)
at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration, DbContext usersContext, DatabaseExistenceState existenceState, Boolean calledByCreateDatabase)
at System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration configuration)
at System.Data.Entity.Migrations.Design.MigrationScaffolder..ctor(DbMigrationsConfiguration migrationsConfiguration)
at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.Run()
at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at System.AppDomain.DoCallBack(CrossAppDomainDelegate callBackDelegate)
at System.Data.Entity.Migrations.Design.ToolingFacade.Run(BaseRunner runner)
at System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldInitialCreate(String language, String rootNamespace)
at System.Data.Entity.Migrations.EnableMigrationsCommand.<>c__DisplayClass2.<.ctor>b__0()
at System.Data.Entity.Migrations.MigrationsDomainCommand.Execute(Action command)

编辑2:

  <connectionStrings>
<add name="DatabaseContext" providerName="System.Data.SqlServerCe.4.0" connectionString="Data Source=SOM_db.sdf;Max Database Size=1024" />
</connectionStrings>

最佳答案

您要求的是可行的,但有一些限制。

解决方案:

首先,删除

Database.Initialize(true);

来自构造函数。多次调用构造函数,包括迁移。

其次,像这样创建一个配置类

internal sealed class DataContextConfiguration : DbMigrationsConfiguration<DataContext>
{
public DataContextConfiguration()
{
AutomaticMigrationsEnabled = true;
AutomaticMigrationDataLossAllowed = true;
ContextKey = "DataContext";
}
}

然后改变构造函数如下:

public DataContext()
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<DataContext, DataContextConfiguration>());
}

你就完成了。插件中实体类型的数据库表将相应地自动创建/更新。

回顾一下,这基本上是一种标准的代码优先方法,启用了自动迁移,但在 OnModelCreating 覆盖内部进行了动态实体类型注册/配置。

限制:

  • 如果不设置AutomaticMigrationDataLossAllowed = true,当删除现有插件时,EF 将产生异常,因为不允许删除相应的表。如果这样做,插件表将被删除,因此如果再次添加插件,它将从零开始。

  • 插件实体只能使用数据注释进行配置。如果你想给他们完全控制权,你可能需要更改插件接口(interface)而不是采用实体类型,而是调用一些方法并传递 DbModelBuilder,这样他们就可以使用 Fluent API自己配置他们的实体类型。

关于c# - Entity Framework 自动更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39348568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com