无法使EF Code First与手动更改的数据库一起使用

时间:2012-08-22 07:09:39

标签: c# asp.net-mvc-3 entity-framework ef-code-first

我已经为我的域模型类添加了两个新属性,并相应地为数据表添加了两个属性。然后我尝试启动我的mvc Web应用程序并获得

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

阅读以下帖子:

MVC3 and Code First Migrations

EF 4.3 Automatic Migrations Walkthrough

我尝试Update-Database通过程序包管理器控制台,但收到错误

Get-Package : Не удается найти параметр, соответствующий имени параметра "ProjectName".
C:\Work\MVC\packages\EntityFramework.5.0.0\tools\EntityFramework.psm1:611 знак:40
+     $package = Get-Package -ProjectName <<<<  $project.FullName | ?{ $_.Id -eq 'EntityFramework' }
+ CategoryInfo          : InvalidArgument: (:) [Get-Package], ParameterBindingException
+ FullyQualifiedErrorId : NamedParameterNotFound,NuGet.PowerShell.Commands.GetPackageCommand

The EntityFramework package is not installed on project 'Domain'.

但是 Entityframework 安装在项目 Domain 上。我从引用中删除了它,删除了 package.config 并成功重新安装了EF。但是Update-Database仍会返回相同的错误。 Update-Database -Config也可以

我做错了什么?

修改

非常感谢Ladislav Mrnka,我会试着改写我的问题。就我手动更改数据表而言,我不应该使用迁移。但是,我现在如何使用手动编辑的域模型类和数据表来使用EF?

3 个答案:

答案 0 :(得分:22)

尝试将其添加到应用程序的启动中(您可以将其添加到App_Start):

Database.SetInitializer<EFDbContext>(null);

它应该关闭与EF处理数据库相关的所有逻辑。您现在将全权负责使数据库与您的模型保持同步。

答案 1 :(得分:2)

我遇到了同样的问题,这就是我解决问题的方法。

我使用sql命令删除了表__MigrationHistory并再次运行update-database -verbose。

显然这个自动创建的表出了问题。

答案 2 :(得分:0)

答案2正是所需要的。虽然当我到达App_Start时,我意识到有4个配置文件,并且没有看到它适合任何一个。相反,我将它添加到我的EF数据库上下文

namespace JobTrack.Concrete
{
    public class EFDbContext : DbContext 
    {
        //Set the entity framework database context to the connection name
        //in the Webconfig file for our SQL Server data source QSJTDB1
        public EFDbContext() : base("name=EFDbConnection")
        {            
        }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        //Remove the tight dependency on the entity framework that 
        //wants to take control of the database. EF by nature wants
        //to drive the database so that the database changes conform
        //to the model changes in the application. This will remove the
        //control from the EF and leave the changes to the database admin
        //side so that it continues to be in sync with the model.
        Database.SetInitializer<EFDbContext>(null);

        //Remove the default pluaralization of model names
        //This will allow us to work with database table names that are singular
        base.OnModelCreating(modelBuilder);
        modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();            
    }

    //Allows for multiple entries of the class State to be used with 
    //interface objects such as IQueryTables for the State database table  
    public DbSet<State> State { get; set; } 

}

}