【问题标题】:MapToStoredProcedures existing procedures ignoredMapToStoredProcedures 现有程序被忽略
【发布时间】:2016-02-24 15:34:34
【问题描述】:

我正在使用带有 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 映射这些过程以在代码中保存项目实体时使用它们。所以我使用 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 不检测现有的存储过程并将它们映射到项目实体?你们中有人遇到过这个问题吗?

非常感谢

【问题讨论】:

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


    【解决方案1】:

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

    Add-Migration AddProjectProcs –IgnoreChanges
    Update-Database
    

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

    【讨论】:

      猜你喜欢
      • 2015-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      相关资源
      最近更新 更多