我正在使用带有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?你们之前有过这个问题吗?
非常感谢
答案 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