Ash*_*pta 245 .net code-first entity-framework-4
错误消息:
"自创建数据库以来,支持'AddressBook'上下文的模型已经改变.手动删除/更新数据库,或者使用IDatabaseInitializer实例调用Database.SetInitializer.例如,RecreateDatabaseIfModelChanges策略将自动删除并重新创建数据库,并且可选择用新数据播种."
我正在尝试使用代码优先功能,以下是我写的:
var modelBuilder = new ModelBuilder();
var model = modelBuilder.CreateModel();
using (AddressBook context = new AddressBook(model))
{
var contact = new Contact
{
ContactID = 10000,
FirstName = "Brian",
LastName = "Lara",
ModifiedDate = DateTime.Now,
AddDate = DateTime.Now,
Title = "Mr."
};
context.contacts.Add(contact);
int result = context.SaveChanges();
Console.WriteLine("Result :- "+ result.ToString());
}
Run Code Online (Sandbox Code Playgroud)
上下文类:
public class AddressBook : DbContext
{
public AddressBook()
{ }
public AddressBook(DbModel AddressBook)
: base(AddressBook)
{
}
public DbSet<Contact> contacts { get; set; }
public DbSet<Address> Addresses { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和连接字符串:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<connectionStrings>
<add name="AddressBook" providerName="System.Data.SqlClient"
connectionString="Data Source=MyMachine;Initial Catalog=AddressBook;
Integrated Security=True;MultipleActiveResultSets=True;"/>
</connectionStrings>
</configuration>
Run Code Online (Sandbox Code Playgroud)
因此,数据库名称为"AddressBook",当我尝试将联系人对象添加到上下文时发生错误.我在这里错过了什么吗?
Mat*_*ear 389
现在是:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<YourDbContext>(null);
base.OnModelCreating(modelBuilder);
}
Run Code Online (Sandbox Code Playgroud)
在YourDbContext.cs文件中.
Ran*_*ndy 133
以下是Jeff发布的关于实际发生的事情的Scott Gu博客的一些信息:
对于那些看到这个例外的人:
"自创建数据库以来,支持'Production'上下文的模型已经改变.手动删除/更新数据库,或者
Database.SetInitializer
使用IDatabaseInitializer
实例调用."以下是该怎么做以及如何处理它:
首次创建模型时,我们运行DatabaseInitializer来执行创建数据库(如果不存在)或添加种子数据等操作.默认的DatabaseInitializer尝试将使用模型所需的数据库模式与存储在使用数据库创建的EdmMetadata表中的模式的哈希进行比较(当Code First是创建数据库的模式时).现有数据库将没有EdmMetadata表,因此不会有哈希...如果缺少该表,今天的实现将抛出.我们将在发送fial版本之前更改此行为,因为它是默认版本.在此之前,现有数据库通常不需要任何数据库初始化程序,因此可以通过调用以下内容类型来关闭它:
Run Code Online (Sandbox Code Playgroud)Database.SetInitializer<YourDbContext>(null);
杰夫
Tom*_*kel 39
对于Entity Framework 5.0.0.0 - 6.1.3
你不要确实要做到以下几点:
1. using System.Data.Entity; to startup file (console app --> Program.cs / mvc --> global.asax
2. Database.SetInitializer<YourDatabaseContext>(null);
Run Code Online (Sandbox Code Playgroud)
是的,Matt Frear是对的.UPDATE -EDIT: 警告是我同意其他人的意见,而不是将此代码添加到添加到DbContext类的global.asax中
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// other code
Database.SetInitializer<YOURContext>(null);
// more code here.
}
Run Code Online (Sandbox Code Playgroud)
正如其他人提到的那样,这也有利于处理单元测试.
目前我正在使用Entity Framework 6.1.3 /.net 4.6.1
Sha*_*Ali 27
只需在SQL Server Management Studio中运行followng sql命令:
delete FROM [dbo].[__MigrationHistory]
Run Code Online (Sandbox Code Playgroud)
Ash*_*pta 19
刚刚找到答案并想到在这里更新.只需要做以下事情.
public class AddressBook: DbContext
{
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.IncludeMetadataInDatabase = false;
}
}
Run Code Online (Sandbox Code Playgroud)
goo*_*all 16
或者您可以将此行放在Application_Start()下的Global.asax.cs文件中:
System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<ProjectName.Path.Context>());
Run Code Online (Sandbox Code Playgroud)
确保将ProjectName.Path.Context更改为您的命名空间和上下文.如果首先使用代码,则只要对架构进行任何更改,这将删除并创建新数据库.
我花了很多天时间来解决这个问题,分析了许多不同的帖子并尝试了很多选项并最终修复了. 这2个项目在我的解决方案中使用EF代码首次迁移:
请求WebApi时出现此错误...
我的环境:
在这里,我收集了您应该注意的所有评论以及必须满足的所有条件/要求,以避免提到的异常:
连接字符串的名称,例如启动项目的配置文件中的MyConnectionString(Web.config/App.config):
<configuration>
<connectionStrings>
<add name="MyConnectionString" connectionString="...">
</connectionStrings>
<configuration>
Run Code Online (Sandbox Code Playgroud)
应该等于在DbContext的构造函数中传递的参数:
public partial class MyDbContext : DbContext
{
public MyDbContext()
: base("name=MyConnectionString"){}
...
Run Code Online (Sandbox Code Playgroud)主要的,修复了我的问题:这很奇怪,但是在我的WebApi/bin文件夹中,DataModel.exe很旧,自上次构建以来没有刷新.由于迁移嵌入在我的程序集DataModel.exe中,因此我的WebApi使用旧镜像更新了数据库.我很困惑为什么在WebApi中更新数据库后,它不符合DataModel的最新迁移脚本.以下代码自动创建(如果不存在)或更新到WebApi/App_Data文件夹中的最新迁移本地数据库.
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>());
...
Run Code Online (Sandbox Code Playgroud)
我试过干净并重建解决方案,但它没有帮助,比我从WebApi完全删除bin和obj文件夹,从WebApi/App_Data删除数据库文件,构建,重新启动WebApi,向它发出请求,它创建了正确的数据库 - 延迟初始化(使用上面的行),它对应于最新的迁移和异常并没有出现更多. 所以,这可能会解决您的问题: