c# - 实体框架6错误“无法找到存储过程'dbo.RosterSummaryData_Subject_Local_Delete'。”

时间:2014-11-17 05:59:54

标签: c# sql-server entity-framework stored-procedures

我有一个代码第一个EF 6模型。我正在尝试使用RemoveRange()删除指定范围的数据,然后在实体上使用SaveChanges()。

customerContext.RosterSummaryData_Subject_Local.RemoveRange(subjLocal); // subjLocal is not important to the question
customerContext.SaveChanges();

当我跳过SaveChanges方法时收到此消息: enter image description here

所以我查看内部异常并看到消息

  Could not find stored procedure 'dbo.RosterSummaryData_Subject_Local_Delete'.

当我使用onModelCreating方法在我的基本实体中创建所有存储过程时,我看不出这是怎么回事:

public partial class CustomerContext : DbContext
{
    public CustomerContext()
        : base("name=CustomerContext")
    {
    }

    public CustomerContext(string connStr) : base(connStr) 
    {

    }

    public virtual DbSet<RosterSummaryData_Cluster_Local> RosterSummaryData_Cluster_Local { get; set; }
    public virtual DbSet<RosterSummaryData_Subject_Local> RosterSummaryData_Subject_Local { get; set; }
    public virtual DbSet<RosterSummaryData_Cluster_Local_Bands> RosterSummaryData_Cluster_Local_Bands { get; set; }
    public virtual DbSet<RosterSummaryData_Subject_Local_Bands> RosterSummaryData_Subject_Local_Bands { get; set; }
    public virtual DbSet<RosterSummaryData_Cluster_Local_Averages> RosterSummaryData_Cluster_Local_Averages { get; set; }
    public virtual DbSet<RosterSummaryData_Subject_Local_Averages> RosterSummaryData_Subject_Local_Averages { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<RosterSummaryData_Cluster_Local>().MapToStoredProcedures();
        modelBuilder.Entity<RosterSummaryData_Subject_Local>().MapToStoredProcedures();
        modelBuilder.Entity<RosterSummaryData_Cluster_Local_Bands>().MapToStoredProcedures();
        modelBuilder.Entity<RosterSummaryData_Subject_Local_Bands>().MapToStoredProcedures();
        modelBuilder.Entity<RosterSummaryData_Cluster_Local_Averages>().MapToStoredProcedures();
        modelBuilder.Entity<RosterSummaryData_Subject_Local_Averages>().MapToStoredProcedures();
    }
}

以下是实例化基本上下文的代码:

CustomerContext customerContext = new CustomerContext(statsInfo.CustomerDCS); 
//statsInfo.CustomerDCS is just the custom connection string for my entity

有没有人有任何想法我在这里做错了或有任何遇到这个问题的经验,因为我看到没有问题,在互联网上找不到任何答案......

编辑:绝对没有创建存储过程,但我发现代码没有错,我有适当的权限。

2 个答案:

答案 0 :(得分:0)

基于错误EF无法找到存储过程。您能否确认存储过程确实是在数据库中创建的?可能是您没有数据库权限来创建存储过程。

您还使用默认迁移选项CreateDatabaseIfNotExists。如果数据库已存在,则不会创建对象。请考虑使用DropCreateDatabaseIfModelChanges或DropCreateDatabaseAlways。这将在每次数据库更改时删除数据库,因此您必须编写迁移脚本以在开发环境中重新填充数据。请参阅下面的代码示例

public CustomerContext(string connStr) : base(connStr) 
{
    Database.SetInitializer<CustomerContext>(new DropCreateDatabaseIfModelChanges<CustomerContext>());
}

答案 1 :(得分:0)

如果数据库中存在存储过程,请确保过程名称包含模式名称“dbo”。例如。 存在过程时有时也会出现此问题DbUpdate也因为无法找到而失败,为此请更改存储过程名称并重试。我希望它能奏效。 感谢。