1

私の WCF Data Service は、そこからデータを取得するときにうまく機能します。新しいデータを挿入しようとすると、次の例外が発生します。

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;

ご想像のとおり、構成ファイルにはそのキーが含まれています。

add name="MyExtEntities " connectionString="metadata=res://*...

スタックは、コア システムが実行されていることを示しています。私の方法からは何もありません。

System.Data.EntityClient.EntityConnection.Open()
で: System.Data.Objects.ObjectContext.EnsureConnection()
で: System.Data.Objects.ObjectContext.SaveChanges(SaveOptions オプション)

で: System.Data.Entity.Internal.InternalContext .SaveChanges()
at: System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
at: System.Data.Entity.DbContext.SaveChanges()
at: lambda_method(Closure , Object )
at: 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.DataService1.HandleRequest()

私はすでにこれをに追加しましたOnStartProcessingRequest

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

フェッチが機能し、同じ接続を使用するのは本当に奇妙です...何を確認すればよいですか?

4

2 に答える 2

0

さて、説明のつかない問題を解決する方法があります。
理由は不明ですが、CreateDataSource メソッドが新しい DbContext インスタンスを作成するときに、常に接続文字列を持っているとは限りません。これが起こらないようにするために、DataService クラスとともに DbContext インスタンスを作成して、適切なインスタンスがあることを確認しました。

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;
    }

これらの変更の後、エラーはなくなりました。

于 2013-07-24T13:43:02.233 に答える
0

挿入のために、回避策を見つけました:

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

INSERT で接続文字列が null です。終わったと思っていたのですが、更新してみました。SaveChanges にヒットすることはなく、例外は同じです。

サービスに送信された URI を確認しました。また、同じ例外がスローされます (接続文字列が null です)。

使用されるDEFAULT CONTEXTは何ですか? EF は明らかに、データをフェッチするサービス オペレーションで使用された接続文字列を使用していません。

OnStartProcessingRequest メソッドでは、CreateDataSource が最初に呼び出され、次に base.OnStartProcessingRequest が呼び出され、次に例外が発生しました。何を設定すればよいですか?

于 2013-07-23T13:15:05.277 に答える