【问题标题】:WCF DataService throws ConnectionString exception on insertWCF DataService 在插入时抛出 ConnectionString 异常
【发布时间】:2013-07-17 13:04:33
【问题描述】:

当我从中获取数据时,我的 WCF 数据服务运行良好。当我尝试插入新数据时,出现以下异常:

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;

您可以相信,配置文件包含该密钥:

添加 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()
在: 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.DataService1.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);
}

提取工作并且使用相同的连接真的很奇怪...... 我应该检查什么?

【问题讨论】:

  • 我调试了我的 Context 的部分类,每当点击 CreateDataSource 时,ConnectionString 永远不会为空或为空。如果我覆盖的唯一一个始终被初始化,那么插入时使用什么上下文?
  • 我调试了 OnStartProcessingRequest 并使用条件设置了一个断点:args.OperationContext.RequestMethod=="POST" 我也设置了 this.CreateDataSource();因此即使请求方法是 POST,它也会创建 DataSource。 CreateDataSource 被击中,几秒钟后我收到异常,指出 ConnectionString 为空。很明显,不同的上下文用于承载插入和更新方法。你能告诉我在哪里可以设置 INSERT 上下文吗?

标签: c# connection-string wcf-data-services


【解决方案1】:

对于插入,我找到了一种解决方法:

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

INSERT 时连接字符串为空。我以为我已经完成了,但我尝试更新。 它从不点击 SaveChanges,异常是一样的。

我检查了发送到我的服务的 URI: http://*/myservice/myservice.svc/Informations(guid'3091f861-0367-4a0a-9b9d-46002e5c2fc5') 它使用 GET 并尝试覆盖记录。 它也会抛出同样的异常(连接字符串为空)。

使用的DEFAULT CONTEXT是什么? EF 显然没有使用我的连接字符串,该字符串由获取数据的服务操作使用。

在 OnStartProcessingRequest 方法中,首先调用 CreateDataSource,然后调用 base.OnStartProcessingRequest,然后出现异常。 我应该设置什么?

【讨论】:

    【解决方案2】:

    好吧,要解决无法解释的问题,这里有一个方法。
    出于未知 的原因,当 CreateDataSource 方法创建一个新的 DbContext 实例时,它并不总是有一个连接字符串。为了防止这种情况发生,我创建了一个 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;
        }
    

    经过这些修改,错误消失了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-26
      • 2012-01-24
      • 2010-12-22
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 2011-08-29
      • 2013-05-24
      相关资源
      最近更新 更多