2013-07-17 31 views
1

當我從中獲取數據時,我的WCF數據服務工作得很好。當我嘗試插入新的數據,我得到以下異常:WCF DataService在插入時拋出ConnectionString異常

ConnectionString屬性尚未初始化

我修改的唯一的事情就是用我的部分類,告訴使用的連接字符串名稱:

public MyExtEntities(string connectionString) : base(connectionString) { ... } : base(connectionString) { ... } 

而且我推翻了CreateDataSource,所以總是有適當的環境:

protected override MyExtEntities CreateDataSource() 
{ 
    MyExtEntities entities = null; 
    try 
    { 
     entities = new MyExtEntities ("name=MyExtEntities"); 
     ... 
     return entities; 

而且你可以相信,在配置文件中包含的關鍵:

添加名稱= 「MyExtEntities」 的connectionString =「元數據= RES:// * ...

堆棧顯示該核心系統運行過程中,從我的方法什麼:

System.Data.EntityClient.EntityConnection.Open()
在: System.Data.Objects.ObjectContext.EnsureConnection()
於: System.Data.Objects.ObjectContext.SaveChanges(SaveOptions選項)

於:System.Data.Entity.Internal.InternalContext.SaveChanges()
於: System.Data.Entity.Internal.LazyInternalContext.SaveChanges ()
於: System.Data.Entity.DbContext.SaveChanges()
於: lambda_method(封閉,對象)
於: System.Data.Services.Providers.DbContextHelper。 <> C_ DisplayClass4.b _0()
於: System.Data.Services.Providers.ObjectContextServiceProvider.SaveContextChanges()
於: System.Data.Services.Providers.ObjectContextServiceProvider.SaveChanges()
在: System.Data.Services.Providers.EntityFrameworkDataServiceProvider.SaveChanges()
於: System.Data.Services.DataService 1.HandleNonBatchRequest(RequestDescription description) <br> at: System.Data.Services.DataService 1.HandleRequest()

我已經添加到了OnStartProcessingRequest

protected override void OnStartProcessingRequest(ProcessRequestArgs args) 
{ 
    if (this.CurrentDataSource == null) 
     this.CreateDataSource(); 
    base.OnStartProcessingRequest(args); 
} 

這真是奇怪的是,取作品,它使用相同的連接... 我應該怎麼檢查?

+0

我調試了我的上下文的部分類,每當CreateDataSource被擊中時,ConnectionString從不爲null或爲空。如果插入的唯一一個始終被初始化,那麼在插入時使用什麼上下文? – Nestor

+0

我調試OnStartProcessingRequest並設置一個斷點與條件: args.OperationContext.RequestMethod ==「POST」 我也設置this.CreateDataSource();所以即使請求方法是POST,它也會創建DataSource。 CreateDataSource被打了幾秒鐘後,我得到了我的異常,說明ConnectionString爲null。 很明顯,使用不同的上下文來託管插入和更新方法。你能告訴我在哪裏可以設置INSERT上下文嗎? – Nestor

回答

0

那麼,要解決無法解釋的問題,這裏是一種方法。
對於未知原因,當CreateDataSource方法創建新的DbContext實例時,它並不總是有一個連接字符串。爲了防止這種情況happenning,我創建了一個的DbContext實例與DataService類一起,以確保我有一個適當的實例:

public class InformationDataService : DataService<InformationEntities> 
    { 
    private InformationEntities context = new InformationEntities("name=InformationEntities"); 

之後,我修改了被覆蓋的的createDataSource總是返回最初創建的(希望正常工作)DbContext:

protected override InformationEntities CreateDataSource() 
    { 
     if (context == null) 
       return new InformationEntities("name=InformationEntities"); 
     return context; 
    } 

經過這些修改後,錯誤消失了。

0

插入我發現了一個變通辦法:

public override int SaveChanges() 
    { 
     if (string.IsNullOrEmpty(this.Database.Connection.ConnectionString)) 
     this.Database.Connection.ConnectionString = savedConnectionString; 
     return base.SaveChanges(); 
    } 

連接字符串上插入空。我以爲我完成了,但我試過更新。 它從來沒有命中SaveChanges,並且異常是相同的。

我檢查了被送到我的服務的URI: HTTP://*/myservice/myservice.svc/Informations(guid'3091f861-0367-4a0a-9b9d-46002e5c2fc5' ) 它使用GET和嘗試取得記錄覆蓋。 它也會引發同樣的異常(連接字符串爲空)。

DEFAULT CONTEXT是什麼使用? EF顯然不使用我的連接字符串,該服務操作使用我的數據。

在OnStartProcessingRequest方法中,首先調用CreateDataSource,然後base.OnStartProcessingRequest,然後出現異常。 我應該設置什麼?