Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 已经有一个名为';表名';在数据库中另一种解决方案_C#_Entity Framework_Asp.net Mvc 4 - Fatal编程技术网

C# 已经有一个名为';表名';在数据库中另一种解决方案

C# 已经有一个名为';表名';在数据库中另一种解决方案,c#,entity-framework,asp.net-mvc-4,C#,Entity Framework,Asp.net Mvc 4,这不是一个真正的问题(目前!),而是分享昨晚发生在我身上的事情,解决方案与stackoverflow或google上的完全不同 在向现有应用程序添加了一些新功能(导致对模型进行了一些更改)之后,我将应用程序部署到我们的开发环境中,没有出现任何问题。然而,当我将它部署到生产环境时,我开始得到这样的信息:“数据库中已经有一个名为‘TableName’的对象。”错误 很明显,EntityFramework试图从头(重新)创建我的模型,而不是更新它。在尝试了几种解决方案(包括Global.asax Se

这不是一个真正的问题(目前!),而是分享昨晚发生在我身上的事情,解决方案与stackoverflow或google上的完全不同

在向现有应用程序添加了一些新功能(导致对模型进行了一些更改)之后,我将应用程序部署到我们的开发环境中,没有出现任何问题。然而,当我将它部署到生产环境时,我开始得到这样的信息:“数据库中已经有一个名为‘TableName’的对象。”错误

很明显,EntityFramework试图从头(重新)创建我的模型,而不是更新它。在尝试了几种解决方案(包括Global.asax SetInitializer(null)、重置迁移等)后,一切都不起作用,只会导致其他错误

在某个时刻,我只是将所有修复更改的尝试回滚,然后从头开始寻找解决方案

解决方案实际上是进入第一个迁移文件(通常称为init或Initial)并注释掉试图创建表的代码。 后来,我看到有另一次迁移试图删除字段,也产生了同样难看的错误(类似于“无法删除字段'FieldName',因为它不存在”),所以我也不得不对这一行进行注释

所以基本上,在注释了一些迁移行之后,一切都开始工作了,模型确实升级到了最新版本

现在,问题来了。
很明显,Dev和Prd在数据库方面是不同步的(在我看来这很好),但由于某种原因,最终导致迁移与生产不兼容,这就是我无法理解Entity Framework如何无法管理这一点的原因。我的意思是,为什么EF试图创建一个已经存在的表?为什么EF试图删除表模式中不存在的字段


这是EF未涵盖的内容吗?或者在某个时刻发生了什么事情,把我项目的整个EF设置搞砸了?

“开发和Prd在DB方面不同步(在我看来这很好)”就是发生在我身上的地方。他们不应该让EF正常工作。您应该调整EF和迁移,使其在这两种情况下都能工作。如果您的测试数据库中没有表a,并且您设置了EF来创建它,那么在表a已经存在的生产环境中,它将失败是正常的。尽量保持您的dbs同步。另一个解决方案是更改迁移,以便它首先检查表A是否存在,但这可能会导致其他自动生成的脚本出现问题。我认为EF实际上可以自己管理它。那么为什么会有一个迁移历史记录表呢?当您认为EF实际上是从数据库本身抽象开发人员时,我发现这种处理差异的方法非常矛盾。EF生成“创建表A”,因为这是您告诉它要做的。如果您想让它升级表A,应该告诉它升级到最新版本。但随后它将尝试将现有表A更新为最新定义。若表A不存在于任何数据库中,它将再次抛出错误。EF可以做很多事情,如果你告诉它创建一个表,它会尝试创建它,如果你告诉它升级它,它会尝试升级它而不检查它是否存在。并没有像(除非您自己编写一个)这样的选项:“若表存在,则更新表;若表不存在,则创建表”。欢迎您编写自己的迁移。清除。尽管如此,必须根据部署到的环境调整迁移是没有意义的。同样,框架通过_MigrationsHistory表跟踪应用于数据库的迁移,因此,如果迁移A(创建字段A1)不存在,则不应应用迁移B1(删除同一字段)。此外,这意味着,如果您的第一次迁移是“创建表”类型的迁移,那么这也意味着后续部署将要求您首先删除此迁移,以避免类似此迁移的错误。希望听到更多关于此迁移的意见。