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

我尝试禁用自动迁移,并且按预期的那样,该服务随后崩溃了,因为它说数据模型具有需要应用的待定更改。

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

我正在使用EF 5。

最佳答案

我有确切的问题...
对于挂起的更改,我必须在启动时向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

希望这可以帮助...

08-28 15:02