【问题标题】:Entity Framework Code First Migrations thinks there is a change that shouldn't be thereEntity Framework Code First Migrations 认为存在不应该存在的变化
【发布时间】:2013-09-03 21:06:14
【问题描述】:

我有一个网站和一个 Windows 服务,它们都引用同一个项目来获取实体框架数据上下文。每次我启动 Windows 服务时,Entity Framework 都会运行自动迁移,将数据库列之一从 NOT NULL 更改为 NULL(不进行其他更改)。该列的属性被标记为 [Required],并且网站(指向其模型的完全相同 DLL 的完全相同版本)正确地认为该列的数据库应该为 NOT NULL。

我尝试禁用自动迁移,但正如预期的那样,服务随后崩溃,因为它说数据模型有待应用的更改。

编辑我发现了更多信息...似乎正在发生这种情况,因为我在该属性上同时具有 [Required] 和 [AllowHtml] 属性。当我删除 [AllowHtml] 属性时,它没有发生。因此,我的问题归结为:1) [AllowHtml] 是否可以与 [Required] 一起使用,以及 2) 这怎么可能仅在 Web 服务使用此代码时发生,而不是在网站使用代码?似乎 Web 服务在看到 [AllowHtml] 时完全忽略了 [Required]。

我正在使用 EF 5。

【问题讨论】:

    标签: .net entity-framework ef-code-first entity-framework-migrations


    【解决方案1】:

    我遇到了确切的问题... 对于未决的更改,我必须在启动时将三行添加到我的 global.asax 文件中,如下所示:

        void Application_Start(object sender, EventArgs e)
        {
            // Code that runs on application startup
            AuthConfig.RegisterOpenAuth();
            Database.SetInitializer<EntityContext>(null);
            EntityContext context = new EntityContext();
            context.Database.Initialize(true);
        }
    

    至于[Allowhtml],你用的是mvc吗? ...据我所知 [AllowHtml] 属于 System.Web.Mvc 命名空间:http://msdn.microsoft.com/en-us/library/system.web.mvc.allowhtmlattribute(v=vs.98).aspx。 AllowHtml 旨在仅用于类型的模型绑定。它们不适用于 Form、QueryString 或 FormCollection 模型绑定。 http://forums.asp.net/t/1645209.aspx 如果一个属性被标记为 AllowHtmlAttribute 属性,ASP.NET MVC 框架会在模型绑定期间跳过对该属性的验证,从而忽略您的 [Required] 属性...

    列从 NOT NULL 更改为 NULL 的原因是因为 [Required] 属性覆盖了允许数据字段为空的数据库架构规则。 http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute.aspx

    希望这会有所帮助...

    【讨论】:

    • 是的,我们正在使用 MVC。 [AllowHtml] 在那里,因为不幸的是,以前的开发人员使用 EF 模型类作为他们的 ViewModel。我仍然不明白的是,指向完全相同 EF 模型的 2 个不同项目如何以不同方式更新数据库。一个忽略 [Required] 属性,而另一个不忽略。
    • 能否请您使用模型的示例代码更新您的问题?以及您在此模型上执行更改架构的操作的代码? (非空和空)。也许,在某个地方你设置了一个属性来忽略它(未映射),因为 Required 应该将架构更改为 NOT NULL....
    【解决方案2】:

    在 EF 项目中,您是否尝试过禁用自动迁移,然后强制 EF 不保持模型和数据库同步?

    在您的 global.asax 文件中,添加:

    Database.SetInitializer<dbContext>(null);
    

    这将删除需要应用待处理迁移的消息

    干杯, 巴特克

    【讨论】:

      猜你喜欢
      • 2016-04-04
      • 2013-11-02
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多