0

Я испытываю странное поведение, которое я действительно не знаю, как его обойти. Я пытаюсь прочитать объект сразу после его вставки (сразу после ExecuteDynamicInsert), и когда возвращается неполный метод, я всегда получаю System.Data.Linq.DuplicateKeyException «База данных сгенерировала ключ, который уже используется. ».LINQ to SQL: Чтение объекта при вызове «SubmitChanges» вызывает DuplicateKeyException

Вот что я пытаюсь достичь с помощью очень простого примера:

DataContext файл MyDataContext.cs:

public partial class MyDataContext 
{ 
    public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode) 
    { 
     //using (TransactionScope ts = new TransactionScope()) 
     //{ 
      base.SubmitChanges(failureMode); 
     //} 
    } 

    partial void InsertCountry(Country instance) 
    { 
     this.ExecuteDynamicInsert(instance); 

     Country country = this.Countries.Where(c => c.CountryID == instance.CountryID).Single(); 
    } //Exception occurs when this method returns... 
} 

файл программы Program.cs:

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (MyDataContext dataContext = new MyDataContext()) 
     { 
      Country c = new Country() 
      { 
       Code = "C", 
       CreatedBy = "Me", 
       CreatedDate = DateTime.Now, 
       ModifiedBy = "Me", 
       ModifiedDate = DateTime.Now 
      }; 

      dataContext.Countries.InsertOnSubmit(c); 

      dataContext.SubmitChanges(); 
     } 
    } 
} 

Если Я не читаю страну после того, как она вставлена, код работает нормально, но мне нужно прочитать ее по какой-либо причине, и я не хочу использовать ChangeSet.

Есть ли способ достичь этого или обойти это поведение?

Заранее спасибо.

ответ

0

У меня было что-то подобное раньше. Попробуйте удалить объект Country из конструктора DataContext и повторно добавить его.

+0

Это не сработало. –

0

Когда переопределять поведение по умолчанию, используя ExecuteDynamic [Insert | Update | Удалить], вы не должны вызывать SubmitChanges. ExecuteDynamic [...] реализует внесение изменений, непосредственно связанных с DataContext. Вы получаете исключение, потому что вы пытаетесь применить изменения снова, когда вы вызываете SubmitChanges.

0

У меня было такое же исключение. В моем экземпляре я использовал instance.ExecuteDynamicUpdate вместо ExecuteDynamicInsert, но я не думаю, что это имеет значение.

Все, что имеет значение, заключается в том, что если вы вносите изменения в объект в иерархии объектов внутри вставки/обновления, вы создаете эту ошибку. Для меня это больше связано с оптимистичным параллелизмом, чем с дублирующими ключами, но эй, я не работаю в Microsoft ...

Я решил проблему, создав новый метод в базовом бизнес-объекте, который называется SubmitChanges на контекст данных объекта и , затем внесли необходимые изменения.

В вашем случае вы можете попробовать добавить метод, называемый Commit к объекту Country следующим образом:

public sub Commit(dc as MyDataContext) 
dc.SubmitChanges() 
Dim country as Country = dc.Countries.Where(function (c) c.CountryID = Me.CountryID).Single() 
end sub 

Затем вызовите c.Commit вместо datacontext.SubmitChanges в Main.

0

У меня была аналогичная проблема. В моем случае я переопределил INSERT по умолчанию хранимой процедурой, но забыл установить первичный ключ. Таким образом, в любое время, когда я вставлял объекты, я получал бы дубликат ключевой ошибки, так как все они возвращались с первичным ключом нуля.