2014-02-19 3 views
-1

При загрузке некоторых данных из 3 партии API, я получал System.Data.Entity.Infrastructure.DbUpdateConcurrencyException от Entity Framework и никаких записей не были вставлены:Entity Framework DbUdateConcurrencyException на Insert

Additional information: Store update, insert, or delete statement affected 
an unexpected number of rows (0). Entities may have been modified or deleted 
since entities were loaded. Refresh ObjectStateManager entries. 

Вот пример класса модели:

[Table("Events")] 
public class StgEvent 
{ 
    public Nullable<DateTime> WebServiceCallDate { get; set; } 
    [Key] 
    public int EventId { get; set; } 
    [MaxLength(100)] 
    public string Lookup { get; set; } 
    [MaxLength(510)] 
    public string Name { get; set; } 
    public Nullable<DateTime> StartDate { get; set; } 
    public Nullable<DateTime> EndDate { get; set; } 
    [MaxLength(510)] 
    public string Client { get; set; } 
    [MaxLength(510)] 
    public string VenueName { get; set; } 
} 

Вот метод нагрузки:

public override void LoadToSqlEF() 
{ 
    using (var context = new DbContext(ConnectionString, SchemaName)) 
    { 
     context.Events.AddRange(Events); 

     context.SaveChanges(); 
    } 
} 

Т его описание ошибки не имело смысла, потому что вставляются только данные. Я не видел ничего подобного в StackOverflow, поэтому я решил, что опубликую свою проблему и разрешение, если у кого-то другая проблема.

+0

Я не уверен, почему есть голосующий голос. Хотя я уже понял эту проблему, и это было довольно просто, я подумал, что это может быть полезно кому-то в будущем ... –

ответ

0

Я понял, что не так, запустив профайлер sql и заметил, что значение EventId не было включено в инструкцию insert. Таким образом, я понял, что мне нужно, чтобы добавить атрибут DatabaseGenerated(DatabaseGeneratedOption.None) к моему EVENTID:

[Table("Events")] 
public class StgEvent 
{ 
    public Nullable<DateTime> WebServiceCallDate { get; set; } 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] 
    public int EventId { get; set; } 
    [MaxLength(100)] 
    public string Lookup { get; set; } 
    [MaxLength(510)] 
    public string Name { get; set; } 
    public Nullable<DateTime> StartDate { get; set; } 
    public Nullable<DateTime> EndDate { get; set; } 
    [MaxLength(510)] 
    public string Client { get; set; } 
    [MaxLength(510)] 
    public string VenueName { get; set; } 
} 

После того, как атрибут был добавлен, вопрос был решен.

0

я получал такую ​​же проблему, но причина была в контексте данных объекта, который содержал следующую строку:

this.Entry (ресурс) .State = EntityState.Modified;

Это помещает объект контекста данных, который необходимо вставить, в состояние, которое заставляет базу данных отказаться от обновления, поскольку она «изменена».

Просто перед сохранением кода попал в следующую строку, содержащую строки выше:

if (resource.Id == Guid.Empty) 
{ 
    this.Entry(resource).State = EntityState.Added; 
    resource.Id = Guid.NewGuid(); 
    resource.Created = DateTime.UtcNow; 
    resource.Modified = DateTime.UtcNow; 
} 
else 
{ 
    this.Entry(resource).State = EntityState.Modified; 
    resource.Modified = DateTime.UtcNow; 
} 

я ее вызвал, установив GUID слишком рано, и первая часть кода никогда не выполняется. Контекст всегда был «изменен», даже когда новый, что вызвало проблему.

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