Исключение оптимистического параллелизма при вставке, несмотря на то, что БД записана нормальноC#

Место общения программистов C#
Ответить
Anonymous
 Исключение оптимистического параллелизма при вставке, несмотря на то, что БД записана нормально

Сообщение Anonymous »

Я пытаюсь понять, что происходит, когда Entity Framework сохраняет отношение «один ко многим».
Вот сгенерированный код на основе моей модели, который генерирует таблицы:

Код: Выделить всё

public override void Up()
{
CreateTable("dbo.Heros", c => new {
Id = c.Int(nullable: false, identity: true),
Name = c.String(unicode: false),
Level = c.Int(nullable: false),
Exp = c.Int(nullable: false),
MaxHp = c.Int(nullable: false),
CurrentHp = c.Int(nullable: false),
Strength = c.Int(nullable: false),
Agility = c.Int(nullable: false),
Intelligence = c.Int(nullable: false),
CharType = c.String(unicode: false),
MaxActionPoints = c.Int(nullable: false),
CurrentActionPoints = c.Int(nullable: false),
Discriminator = c.String(nullable: false, maxLength: 128, storeType: "nvarchar"),
}).PrimaryKey(t => t.Id);

CreateTable("dbo.Equipment", c => new {
Id = c.Int(nullable: false, identity: true),
Name = c.String(unicode: false),
CompatibleCharacterType = c.String(unicode: false),
StrengthBonus = c.Int(nullable: false),
AgilityBonus = c.Int(nullable: false),
EnduranceBonus = c.Int(nullable: false),
IntelligenceBonus = c.Int(nullable: false),
ApToUse = c.Int(nullable: false),
Range = c.Int(nullable: false),
Target = c.Int(nullable: false),
EquipmentType = c.Int(nullable: false),
ArmorType = c.Int(),
ArmorValue = c.Int(),
Duration = c.Int(),
UseCount = c.Int(),
Discriminator = c.String(nullable: false, maxLength: 128, storeType: "nvarchar"),
AbstractCharacter_Id = c.Int(),
}).PrimaryKey(t => t.Id)
.ForeignKey("dbo.Heros", t => t.AbstractCharacter_Id)
.Index(t => t.AbstractCharacter_Id);
}
Внешний ключ в таблице Equipment связан со списком оборудования в моей модели Hero (AbstractCharacter).
В моем коде я создаю Hero и добавляю ему недавно созданное снаряжение.
Когда я пытаюсь сохранить героя, добавляю его в DbSet DbContext, а затем сохраняю DbContext с вызовом SaveChanges(), я получил 2 результата:
  • Мой герой хранится в базе данных, а также его оборудование с правильным внешним ключом
  • Выдается исключение OptimisticConcurrencyException
Что Я читал об этом исключении: оно возникает при запросах на обновление или удаление, а не на вставку. Я подумал, что он был поднят, потому что сначала было вставлено оборудование, затем герой, а затем оборудование было обновлено, чтобы установить свои внешние ключи для вновь вставленного героя. Я пытался использовать транзакцию, но поведение не изменилось.

Код: Выделить всё

public AbstractCharacter createCharacter(AbstractCharacter character)
{
DbContextTransaction trans = model.Database.BeginTransaction();
model.Characters.Add(character);
model.SaveChanges(); // Always a DbUpdateException (inner exception : OptimisticConcurrencyException)
trans.Commit();
return character;
}
Кто-нибудь знает, что происходит и как это решить?

Подробнее здесь: https://stackoverflow.com/questions/797 ... written-ok
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»