SQL Anywhere .NET 数据提供程序抛出身份验证违规异常

SQL Anywhere .NET Data Provider throws Authentication violation exception

我有一个 Sybase 数据库,我从中生成了一个 ADO.Net Entity Data Model。这是 App.config 文件中的 connectionString

connectionString="metadata=res://*/Test.csdl|res://*/Test.ssdl|res://*/Test.msl;provider=iAnywhere.Data.SQLAnywhere;provider connection string="userid=testUser;password=testPassword;datasourcename=test"" providerName="System.Data.EntityClient"

我尝试将新实体添加到 table 数据库中具有单个自动增量属性:

while (true)
{
    using (var context = new Entities())
    {
        var testEntity = new TestTable();
        context.TestTables.Add(testEntity);
        try
        {
            context.SaveChanges();
        }
        catch (Exception ex)
        {
        }
    }
}

这对于前几(百、千)次迭代工作正常。但在那之后,当调用 context.SaveChanges() 时,我得到一个 iAnywhere.Data.SQLAnywhere.SAException,消息 Authentication violation,来源 "SQL Anywhere .NET Data Provider"。这是堆栈跟踪:

at iAnywhere.Data.SQLAnywhere.SACommand._ExecuteReader(CommandBehavior commandBehavior, Boolean isExecuteScalar, Boolean isBeginExecuteReader)
at iAnywhere.Data.SQLAnywhere.SACommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior)
at System.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator translator, EntityConnection connection, Dictionary`2 identifierValues, List`1 generatedValues)
at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)

我正在使用 VS2012.Net Framework v4.5Entity Framework 5.0SQLAnywhere 12 version 12.1.4216

当然这是一个简化的场景,在实际情况中我并没有在循环中调用 SaveChanges(),但是在几次调用后我得到了相同的异常。欢迎知道为什么抛出此异常以及解决方案是什么。

似乎 SQL Anywhere 的 OEM 版本可以有未验证和已验证的连接。未经身份验证的人只能(理论上)从数据库中读取并以某种方式写入它(第一次写入后 30 秒,在我的例子中是 SaveChanges() 调用)。下面是验证连接的代码:

private static string AuthCommand = "SET TEMPORARY OPTION CONNECTION_AUTHENTICATION='Company=COMPANY_NAME;Application=APPLICATION;Signature=SIGNATURE'";
private bool AuthCommandIssued = false;

public override int SaveChanges()
{
    if (!AuthCommandIssued)
    {
        Database.ExecuteSqlCommand(AuthCommand);
        AuthCommandIssued = true;
    }
    return base.SaveChanges();
}

有关此内容以及如何开发经过身份验证的应用程序和获取身份验证参数的更多信息,请参见 here