8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

支持该模型自数据库创建以来,上下文已经发生改变

Shivam Kotwalia 1月前

77 0

错误消息:\'自创建数据库以来,支持“AddressBook”上下文的模型已发生更改。请手动删除/更新数据库,或使用

错误信息:

\'自创建数据库以来,支持“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());
}

上下文类:

public class AddressBook : DbContext
{
    public AddressBook()
    { }
    public AddressBook(DbModel AddressBook)
        : base(AddressBook)
    {

    }
    public DbSet<Contact> contacts { get; set; }
    public DbSet<Address> Addresses { get; set; }
}

以及连接字符串:

<?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>

因此,数据库名称是“AddressBook”,当我尝试将联系人对象添加到上下文时发生错误。我这里遗漏了什么吗?

帖子版权声明 1、本帖标题:支持该模型自数据库创建以来,上下文已经发生改变
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Shivam Kotwalia在本站《sql-server》版块原创发布, 转载请注明出处!
最新回复 (0)
  • Zin 1月前 0 只看Ta
    引用 2

    @ZahidHasan 绝对不要删除 __MigrationsHistory 表,除非您完全理解 __MigrationsHistory 的用途,并且愿意手动协调代码和数据库之间的差异,并在生产中做出相同的更改。

  • 现在是:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<YourDbContext>(null);
        base.OnModelCreating(modelBuilder);
    }
    

    在你的 YourDbContext.cs 文件中。

  • 比 Global.asax 更好的方法是将其放在 DbContext 类的构造函数中。这样,它适用于使用上下文的每个站点,而不仅仅是 Global.asax 文件控制的一个站点。

  • 最好将其放在上下文类的静态构造函数中,这样它只会被调用一次 - 如本示例视频所示:msdn.microsoft.com/en-us/data/jj572367

  • 它应该放在受保护的覆盖 void OnModelCreating(DbModelBuilder modelBuilder) { Database.SetInitializer 内(空);base.OnModelCreating(modelBuilder);}

  • Ravi 1月前 0 只看Ta
    引用 7

    有关实际发生情况的 Scott Gu 的博客 中发布的 Jeff 一些信息

    对于那些看到此异常的人来说:

    \'自数据库创建以来,支持“生产”上下文的模型已发生更改。请手动删除/更新数据库,或 Database.SetInitializer 使用 IDatabaseInitializer 实例进行调用。\'

    以下是正在发生的情况以及解决办法:

    首次创建模型时,我们会运行 DatabaseInitializer 来执行诸如创建数据库(如果不存在)或添加种子数据之类的操作。默认的 DatabaseInitializer 会尝试将使用模型所需的数据库架构与存储在数据库创建的 EdmMetadata 表中的架构哈希值进行比较(当 Code First 创建数据库时)。现有数据库不会有 EdmMetadata 表,因此不会有哈希值……如果该表缺失,今天的实现将会抛出错误。我们将在发布最终版本之前努力改变这种行为,因为它是默认行为。在此之前,现有数据库通常不需要任何数据库初始化程序,因此可以通过调用以下命令为您的上下文类型关闭它:

    Database.SetInitializer<YourDbContext>(null);
    

    杰夫

  • 我今天尝试了这个,我不再得到“模型已更改”,而是得到“无效的对象名称‘dbo.Table’”

  • Jeff 想要解决这个问题,但已经过去两年多了,仍然需要将 SetInitializer 设置为 null。对吗?所以有人可以解释一下这如何适应迁移工作流程吗?

  • mic 1月前 0 只看Ta
    引用 10

    @jakejgordon:我也用的是 EF6,但如果它在 Global.asax 中,它只能修复运行网站时的问题。如果你有单元测试,你就 OOL 了。最好把它放在 YourDbContext 的构造函数中。这可以修复每个项目的问题,包括网站和测试项目。

  • mlvt 1月前 0 只看Ta
    引用 11

    我认为这个答案应该得分更高,因为它实际上解释了为什么我们需要添加这行代码。谢谢。

  • @StefanBergfeldt 如果您或任何人获得无效的对象名称'dbo.Table,请检查您的连接字符串attachDbFilename和初始目录

  • 对于 实体框架 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);
    

    是的,Matt Frear 是正确的。 更新 - 编辑: 需要注意的是,我同意其他人的观点,而不是将此代码添加到 global.asax 中,并将其添加到您的 DbContext 类中。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        // other code 
        Database.SetInitializer<YOURContext>(null);
        // more code here.
    }
    

    正如其他人提到的,这也有利于处理单元测试。

    目前我正在使用 Entity Framework 6.1.3 /.net 4.6.1

    我将在不久的将来回来提供 CORE 片段。

  • Shad 1月前 0 只看Ta
    引用 14

    但是,当你第一次初始化数据库时,如果我在 onModelCreating 方法中将 setinitializer 设置为 null,则不会创建数据库。有什么想法吗?尽管我使用 (var context = Activator.CreateInstance()){ 上下文.数据库.初始化(true); }

  • 我需要找到我将使用的代码,有时我会注释掉一行并交换...我不记得这个问题了,我需要看看。

  • 只需在 SQL Server Management Studio 中运行以下 SQL 命令:

    delete FROM [dbo].[__MigrationHistory]
    
  • 除非您完全理解__MigrationsHistory 的用途并且愿意手动协调代码和数据库之间的差异并在生产中做出相同的更改,否则请不要删除__MigrationsHistory 表。

  • 此修复在 CTP5 之后不再有效。

    你必须做 Database.SetInitializer<YourContext>(null);

  • 那去哪儿了...OnModelCreating 没有可访问的名为 DbDatabase 的东西

  • Database.SetInitializer 似乎在 EF 4.3 最终版本中运行良好。

返回
作者最近主题: