У меня проблема с токеном параллелизма DateTime.Вот простой способ воспроизвести проблему.Имеется одна сущность:
public class Employee
{
public int EmployeeID { get; set; }
public string Name { get; set; }
[ConcurrencyCheck]
public DateTime LastModified { get; set; }
}
Тривиальный DbContext:
public class MyContext : DbContext
{
public DbSet<Employee> Employees { get; set; }
}
И следующий код:
Employee orig;
// Create a row (insert)
using (var context = new MyContext())
{
orig = new Employee
{
Name = "Mike",
LastModified = DateTime.Now
};
context.Employees.Add(orig);
context.SaveChanges();
}
// Update the row, passing the right concurrency token
using (var context = new MyContext())
{
var clone = new Employee
{
EmployeeID = orig.EmployeeID,
Name = "Suzanne",
// Pass the concurrency token here
LastModified = orig.LastModified
};
context.Employees.Attach(clone);
// Mark the entity as modified to force an update
context.Entry(clone).State = EntityState.Modified;
// Boom! Currency exception!
context.SaveChanges();
}
По сути, я создаю сотрудника, а затем обновляю его,Взрыв!Я смотрю на оператор обновления, сгенерированный на SQL (профилирование):
exec sp_executesql N'update [dbo].[Employees]
set [Name] = @0, [LastModified] = @1
where (([EmployeeID] = @2) and ([LastModified] = @3))
',N'@0 nvarchar(max) ,@1 datetime2(7),@2 int,@3 datetime2(7)',@0=N'Suzanne',@1='2012-02-21
12:06:30.0141536',@2=0,@3='2012-02-21 12:06:30.0141536'
Мне кажется, что это утверждение звучит нормально, но оно не выполняется, то есть оно изменяет нулевую строку, как если бы ([LastModified] = @ 3) произошел сбой.
Я подозреваю, что существует «проблема точности», то есть количество цифр не соответствует сохраненному.Может ли быть несоответствие между представлением DateTime в .NET и SQL?
Я пытался использовать System.Data.SqlTypes.SqlDateTime вместо DateTime в моем классе Poco, надеясь, что это будет иметь правильную точность, но яне смог отобразить его, EF всегда оставлял свойство не отображенным.
Решения?