2016-03-21 2 views
3

Я использую поставщика Npgsql EF6 (Npgsql v3.0.5.0). Я создал модель из существующей базы данных. Я могу получить доступ к базе данных и читать записи, но обновление существующих записей не выполняется.EntityFramework6 для Npgsql создает неверный оператор обновления

Это упрощенная версия моего кода:

int jobId = 123; // some unique id 
Entities entities = new Entities(); 
Job job = entities.Jobs.First(j => j.Id = jobId); 
job.Status = 4; 
entities.SaveChanges(); // this line throws an exception 

Это сообщение об ошибке я получаю от этого кода:

42601: syntax error at or near "(" 

[NpgsqlException (0x80004005): 42601: syntax error at or near "("] 
    Npgsql.NpgsqlConnector.DoReadSingleMessage(DataRowLoadingMode dataRowLoadingMode, Boolean returnNullForAsyncMessage, Boolean isPrependedMessage) +445 
    Npgsql.NpgsqlConnector.ReadSingleMessage(DataRowLoadingMode dataRowLoadingMode, Boolean returnNullForAsyncMessage) +282 
    Npgsql.NpgsqlCommand.Execute(CommandBehavior behavior) +270 
    Npgsql.NpgsqlCommand.ExecuteNonQueryInternal() +177 
    Npgsql.NpgsqlCommand.ExecuteNonQuery() +21 
    System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.<NonQuery>b__0(DbCommand t, DbCommandInterceptionContext`1 c) +26 
    System.Data.Entity.Infrastructure.Interception.InternalDispatcher`1.Dispatch(TTarget target, Func`3 operation, TInterceptionContext interceptionContext, Action`3 executing, Action`3 executed) +129 
    System.Data.Entity.Infrastructure.Interception.DbCommandDispatcher.NonQuery(DbCommand command, DbCommandInterceptionContext interceptionContext) +602 
    System.Data.Entity.Internal.InterceptableDbCommand.ExecuteNonQuery() +151 
    System.Data.Entity.Core.Mapping.Update.Internal.DynamicUpdateCommand.Execute(Dictionary`2 identifierValues, List`1 generatedValues) +1045 
    System.Data.Entity.Core.Mapping.Update.Internal.UpdateTranslator.Update() +221 

Это запрос, который в настоящее время работает с базой данных:

UPDATE (
    SELECT 
     "Jobs"."Id", 
     "Jobs"."Name", 
     "Jobs"."Created", 
     "Jobs"."Status" 
    FROM "Jobs"."Jobs" 
    AS "Jobs" 
) SET "Status"=$1 WHERE "Id" = $2 

Я понимаю, что этот вопрос, очевидно, не будет работать с вложенной SELECT, а не имя таблицы.

Есть ли у кого-то такая же ошибка? Есть где-то где-то, что я могу пропустить?

ответ

2

Эта ошибка была вызвана отсутствующим основным ключом на поврежденной таблице.

Файл .edmx фактически содержал следующее сообщение:

warning 6002: The table/view '[database.schema.TableName]' does not have a primary key defined. The key has been inferred and the definition was created as a read-only table/view. 

Visual Studio также показывает следующее сообщение на вкладке вывода при обновлении модели из базы данных (который я должен пропустил в первый раз модель была сгенерировано):

The model was generated with warnings or errors.ServiceModel.edmxPlease see the Error List for more details. These issues must be fixed before running your application. 

 Смежные вопросы

  • Нет связанных вопросов^_^