我需要將EF中的Context對象傳遞給WCF方法。將實體框架上下文對象傳遞給WCF
通常情況下,我在WCF方法中創建Context對象,並在方法調用結束之前處理它,對於我的大多數方法來說工作正常。
但是,我需要將Context對象(特別是DBContext)從MVC控制器傳遞到我特定的WCF方法,因爲我爲某些查找表啓用了緩存。我需要傳遞給這個特定的Context對象(我在Global.asax文件的Application_Start方法中設置的那個對象),而不是我在上面的語句中做的,因爲我將這個特定的對象用於SqlDependency。如果我嘗試創建新的DBContext對象,我不能使用SqlDependency,因爲我會得到一個錯誤,告訴我需要在數據庫調用之前啓用SqlDependency。
問題是,當我嘗試啓動我的WCF測試客戶端工具時,出現以下錯誤(縮短了簡潔性),我知道該工具與正確聲明KnownType屬性(即DBContext對象) 。請注意,WCF項目編譯得很好。我需要一些關於這個特定部分的幫助,因爲我從未在我的WCF服務中使用KnownType。它們都是簡單的類型(int,string等)。
Error: Cannot obtain Metadata from http://localhost:8732/Design_Time_Addresses/YeagerTechWcfService/YeagerTechWcfService/mex
If this is a Windows (R) Communication Foundation service to which you have access, please check that you have enabled metadata publishing at the specified address. For help enabling metadata publishing, please refer to the MSDN documentation at http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange
Error URI: http://localhost:8732/Design_Time_Addresses/YeagerTechWcfService/YeagerTechWcfService/mex Metadata contains a reference that cannot be resolved:
,我有以下OperationContract的代碼在我的WCF服務:
[OperationContract]
IEnumerable<Category> GetCategories(YeagerTechEntities DbContext);
我有我的WCF服務的以下DataContract代碼:
namespace YeagerTechModel
{
[Serializable]
[DataContract(IsReference = true)]
[KnownType(typeof(YeagerTechEntities))]
public partial class Category
{
public Category()
{
this.Projects = new HashSet<Project>();
}
[DataMember]
public short CategoryID { get; set; }
[DataMember]
public string Description { get; set; }
[DataMember]
public virtual ICollection<Project> Projects { get; set; }
}
}
最後,下面是我的WCF方法:
public IEnumerable<YeagerTechModel.Category> GetCategories(YeagerTechEntities DbContext)
{
//YeagerTechEntities DbContext = new YeagerTechEntities();
DbContext.Configuration.ProxyCreationEnabled = false;
IEnumerable<YeagerTechModel.Category> category = DbContext.Categories.Where(p => p.CategoryID > 0).AsCached("Categories").ToList();
//IEnumerable<YeagerTechModel.Category> category = DbContext.Categories.Where(p => p.CategoryID > 0);
CloseConnection(DbContext);
return category;
}
如果你改變你的代碼返回null,這個錯誤會消失嗎?如果你也擺脫了'KnownType'呢?試圖像這樣拆分代碼,一次刪除一個潛在的故障點,將有助於隔離問題。 –
我在發佈錯誤後將KnowType屬性放入DataContract中。 – sagesky36
我不認爲你應該在界面中傳遞上下文。我不認爲它會被序列化,並且可能會導致巨大的麻煩。你有沒有嘗試刪除它(可能會讓你的身體變空)?您可以使用其他方法傳遞它,但應該在服務器端進行選擇。 –