关于这个错误,我在过去几个小时里一直把我的头撞到了墙上,请在将此标记为"重复之前"请仔细阅读这个问题,我和其他所有人都知道这个"可以"被标记为重复,我甚至遇到了我自己的问题,这是很久以前被问过的,当时的解决方案是删除我的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);
}
我尝试过的事情是:
打开.EDMX
文件的模型浏览器,并从模型和商店中删除存储过程并重新更新模型。没有工作。
打开.EDMX
文件的模型浏览器并从模型和商店中删除存储过程,然后删除存储过程定义并重新更新模型。没有工作。
重新删除并重新创建.EDMX
。不,也没有工作(这对我有用)
我之前也做了一些研究,并且遇到过这类问题,但没有为我的困境得到任何正确的答案,也没有任何可靠的推理,为什么会发生这种情况或者如何解决这个问题。如果情况变得更糟,那么我可以在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;
}