抑制状态错误CS1936无法找到源类型' int'的查询模式的实现。 '选择'找不到

时间:2016-07-12 19:20:02

标签: c# entity-framework

关于这个错误,我在过去几个小时里一直把我的头撞到了墙上,请在将此标记为"重复之前"请仔细阅读这个问题,我和其他所有人都知道这个"可以"被标记为重复,我甚至遇到了我自己的问题,这是很久以前被问过的,当时的解决方案是删除我的EDMX并重新生成它;)

  

找不到源类型' int'的查询模式的实现。 '选择'找不到

我在SSMS中编写了一个存储过程:

create procedure usp_GetMaterialByVendorID
    (@VendorID int)
AS
    SET NOCOUNT OFF
    SET TRANSACTION ISOLATION LEVEL READ COMMITTED

    DECLARE @ERROR_SEVERITY int,
            @MESSAGE varchar(1000),
            @ERROR_NUMBER int,
            @ERROR_PROCEDURE nvarchar(200),
            @ERROR_LINE int,
            @ERROR_MESSAGE nvarchar(4000);
    begin try
        select
            mat.MaterialID,
            mcat.MaterialCategoryID,
            mcat.MaterialCategory,
            mtype.MaterialType,
            mstype.MaterialSubType,
            mat.Description,
            mcost.Cost,
            mat.NewPrice,
            mat.RemodelPrice
        from 
            [Material] mat
        inner join 
            [MaterialCategory] mcat on mcat.MaterialCategoryID = mat.MaterialCategoryID
        inner join 
            [MaterialType] mtype on mtype.MaterialTypeID = mat.MaterialTypeID
        inner join 
            [MaterialSubType] mstype on mstype.MaterialSubTypeID = mat.MaterialSubTypeID
        inner join 
            [MaterialCost] mcost on mcost.MaterialID = mat.MaterialID
        where 
            mat.VendorID = @VendorID
    end try
    BEGIN CATCH
        SET @ERROR_SEVERITY = ISNULL(ERROR_SEVERITY(),'');
        SET @ERROR_NUMBER = ISNULL(ERROR_NUMBER(),'');
        SET @ERROR_PROCEDURE = ISNULL(ERROR_PROCEDURE(),''); 
        SET @ERROR_LINE = ISNULL(ERROR_LINE(),'');
        SET @ERROR_MESSAGE = ISNULL(ERROR_MESSAGE(),'');

        -- Test if the transaction is uncommittable.
        IF (XACT_STATE()) = -1
        BEGIN
            --PRINT N'The transaction is in an uncommittable state. Rolling back transaction.'
            ROLLBACK TRANSACTION;
        END;

        -- Test if the transaction is active and valid.
        IF (XACT_STATE()) = 1
        BEGIN
            --PRINT N'The transaction is committable. Committing transaction.'
            COMMIT TRANSACTION;   
        END;

        SET @MESSAGE = 'Error occurred in stored procedure ' + cast(@ERROR_PROCEDURE as varchar(200)) + 
                    '; Line Number ' + cast(@ERROR_LINE as varchar) + 
                    '; Message: [' + cast(@ERROR_NUMBER as varchar) + '] - '
                    + cast(@ERROR_MESSAGE as varchar(255))

        RAISERROR(@MESSAGE, @ERROR_SEVERITY, 1);
    END CATCH;

然后打开实体框架.EDMX文件并从数据库更新并添加存储过程。没问题。

然后我进入了我的DAL并在此处写了这个方法

public List<VendorMaterials> GetMaterialsByVendorID(int id)
{
        UsherEntities = new ExovationsUsherEntities();

        List<VendorMaterials> lst = new List<VendorMaterials>();

        var query = from a in UsherEntities.usp_GetMaterialByVendorID(id)
                    select a;
        return lst;
}

就像我在项目中做了很多次我正在做的事情。 并在这一行

var query = from a in UsherEntities.usp_GetMaterialByVendorID(id)
            select a;

是抛出错误的地方,所以我在usp_GetMaterialByVendorID上做了一个F12并找到它并看了一下它看起来像我有的其他

public virtual int usp_GetMaterialByVendorID(Nullable<int> vendorID)
{
        var vendorIDParameter = vendorID.HasValue ?
            new ObjectParameter("VendorID", vendorID) :
            new ObjectParameter("VendorID", typeof(int));

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("usp_GetMaterialByVendorID", vendorIDParameter);
}

我尝试过的事情是:

  1. 打开.EDMX文件的模型浏览器,并从模型和商店中删除存储过程并重新更新模型。没有工作。

  2. 打开.EDMX文件的模型浏览器并从模型和商店中删除存储过程,然后删除存储过程定义并重新更新模型。没有工作。

  3. 重新删除并重新创建.EDMX。不,也没有工作(这对我有用)

  4. 我之前也做了一些研究,并且遇到过这类问题,但没有为我的困境得到任何正确的答案,也没有任何可靠的推理,为什么会发生这种情况或者如何解决这个问题。如果情况变得更糟,那么我可以在LINQ写出来,但不想走那条路。

    有什么想法吗?

    修改

    此方法几乎与所讨论的方法相同

    public List<VendorContact> GetVendorContactsByVendorID(int id)
        {
            UsherEntities = new ExovationsUsherEntities();
    
            List<VendorContact> lst = new List<VendorContact>();
    
            var query = from a in UsherEntities.usp_GetVendorContactByID(id)
                        select a;
    
            foreach(var a in query)
            {
                lst.Add(new VendorContact
                {
                    VendorID = a.VendorID,
                    ContactID = a.ContactID,
                    ContactName = a.ContactName,
                    FirstName = a.FirstName,
                    LastName = a.LastName,
                    Phone = a.Phone,
                    Cell = a.Cell,
                    Fax = a.Fax,
                    Email = a.Email
                });
            }
    
            return lst;
        }
    

0 个答案:

没有答案