MapToStoredProcedures忽略了现有过程

时间:2016-02-24 15:34:34

标签: c# asp.net-mvc entity-framework stored-procedures ef-code-first

我正在使用带有SQL Server(LocalDB)的EF 6在ASP.Net MVC网站上工作。 我为表的插入,更新,删除方法创建了自定义存储过程:

CREATE PROCEDURE dbo.Project_Insert
   @LeftBound INT,
   @RightBound INT,
   @Level INT,
   @Name NVARCHAR(MAX),
   @SuggestedAt DATE,
   @SuggestedById INT
AS
BEGIN
...

我希望EF在代码中保存Project实体时映射这些过程以使用它们。所以我使用MapToStoredProcedures:

modelBuilder.Entity<Project>().MapToStoredProcedures(p => 
            p.Insert(u => u.HasName("dbo.Project_Insert"))
             .Update(u => u.HasName("dbo.Project_Update"))
             .Delete(u => u.HasName("dbo.Project_Delete")));

问题是,即使我仔细检查了存储过程和模型类的名称,Update-Database方法仍然告诉我有待处理的更改:

  

无法更新数据库以匹配当前模型,因为存在挂起的更改并且已禁用自动迁移。将挂起的模型更改写入基于代码的迁移或启用自动迁移。将DbMigrationsConfiguration.AutomaticMigrationsEnabled设置为true以启用自动迁移。   您可以使用Add-Migration命令将挂起的模型更改写入基于代码的迁移。

当我运行Add-Migration Test时,EF会创建一个包含基本存储过程的迁移文件,因为它认为数据库中缺少该文件:

CreateStoredProcedure(
"dbo.Project_Insert",
 p => new
 {
     LeftBound = p.Int(),
     RightBound = p.Int(),
     Level = p.Int(),
     Name = p.String(),
     SuggestedAt = p.DateTime(storeType: "date"),
     SuggestedById = p.Int(),
 },
 body:
     @"INSERT [dbo].[Projects]([LeftBound], [RightBound], [Level], [Name], [SuggestedAt], [SuggestedById]) ...

我的问题是:为什么EF不会检测现有的存储过程并将它们映射到Project Entity?你们之前有过这个问题吗?

非常感谢

1 个答案:

答案 0 :(得分:0)

代码第一个工作流程要求您先执行代码并让它更新数据库。解决方法是添加一个空迁移,它将手动数据库更改与代码优先模型同步:

#!/bin/sh
export PHP_FCGI_CHILDREN=3
exec /path/to/cgi-bin/php.cgi -c /home/user/public_html/subfolder/php.ini

https://msdn.microsoft.com/en-us/data/dn579398.aspx?f=255&MSPPError=-2147217396#option1