Поставщик данных SQL Anywhere .NET выдает исключение нарушения аутентификации
У меня есть Sybase
база данных, из которой я сгенерировал ADO.Net Entity Data Model
, Вот connectionString
от App.config
файл:
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"
Я пытаюсь добавить новые объекты в таблицу с одним атрибутом автоинкремента в базе данных:
while (true)
{
using (var context = new Entities())
{
var testEntity = new TestTable();
context.TestTables.Add(testEntity);
try
{
context.SaveChanges();
}
catch (Exception ex)
{
}
}
}
который отлично работает для первых нескольких (сотен, тысяч) итераций. Но после этого я получаю iAnywhere.Data.SQLAnywhere.SAException
с сообщением Authentication violation
, источник "SQL Anywhere .NET Data Provider"
когда звонишь context.SaveChanges()
, Вот трассировка стека:
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.5
, Entity Framework 5.0
, SQLAnywhere 12 version 12.1.4216
,
Конечно, это упрощенный сценарий, в реальном случае я не звоню SaveChanges()
в цикле, тем не менее, я получаю то же исключение после нескольких звонков. Любая идея о том, почему выбрасывается это исключение и каково его решение, будет приветствоваться.
1 ответ
Похоже, OEM издание SQL Anywhere
может иметь неаутентифицированные и аутентифицированные соединения. Неаутентифицированные могут только читать (теоретически) из базы данных и каким-то образом записывать в нее (в течение 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();
}
Более подробную информацию об этом и о том, как разработать аутентифицированные приложения и получить параметры аутентификации, можно найти здесь.