Мне удалось найти причину этой проблемы и предотвратить ее возникновение, но я не могу точно объяснить, почему она возникла.
Мои таблицы содержат столбец TimeStamp и соответствующее свойство в базовом классе для моих сущностей.
Я не отображал базовый класс в своем первоначальном вопросе, потому что он включает в себя только RowVersion и другие свойства аудита, которые, как я предполагал, не имеют значения.
Можно было бы подумать, что я узнал бы, не предполагая ничего о Entity Framework.
Вот мое определение базового класса для сущности Степень:
public abstract class EntityBase : ValidableObject, IEntityBase
{
public virtual byte[] RowVersion { get; protected set; }
public virtual DateTime? CreateDate { get; set; }
public virtual string CreateUser { get; set; }
public virtual DateTime? ModifyDate { get; set; }
public virtual string ModifyUser { get; set; }
}
Вот моя конфигурация контекстной модели для объекта Степень:
internal class DegreeConfiguration : EntityTypeConfiguration<Degree>
{
internal DegreeConfiguration()
: base()
{
ToTable("Degree", "dbo");
Property(x => x.RowVersion).IsRowVersion();
}
}
Из-за требований моего приложения я должен загрузить сущность Person, используя метод Include, чтобы быстро загрузить сущность Degree, чтобы граф объекта был
полностью заполнен, когда потребитель запрашивает объект.
return ctx.People.Include(p => p.Degree).Where(x => x.PersonId == id).First();
Когда свойство DegreeId объекта Person изменяется и присоединяется к контексту, генерируется следующий оператор Update
после вызова SaveChanges ():
exec sp_executesql N'declare @p int
update [dbo].[Degree]
set @p = 0
where (([DegreeId] = @0) and ([RowVersion] = @1))
select [RowVersion]
from [dbo].[Degree]
where @@ROWCOUNT > 0 and [DegreeId] = @0',N'@0 int,
@1 binary(8)',@0=2,@1=0x00000000000007DF
Это происходит, несмотря на то, что я сознательно не обновляю сущность Степень, и вызывает хаос, когда два или более пользователей используют приложение одновременно.
Чтобы исключить создание оператора Update для свойства навигации Degree, я прокомментировал проверку параллелизма в конфигурации модели следующим образом:
internal class DegreeConfiguration : EntityTypeConfiguration<Degree>
{
internal DegreeConfiguration()
: base()
{
ToTable("Degree", "dbo");
//Property(x => x.RowVersion).IsRowVersion();
}
}
После повторного выполнения процесса EF больше не создает проблемный оператор Update.
Я провел значительное количество поисков как на сайте MS для EF 4.1, так и общих запросов Google. Я не могу придумать никаких конкретных объяснений.
Спасибо.